无法通过wcf将mongodb objectId暴露给mvc

时间:2015-12-08 12:41:19

标签: c# asp.net-mvc mongodb wcf datacontractserializer

我在提供wcf服务时遇到了烦人的问题。我熟悉wcf及其用法。

服务实施:

public class Service : IService
{
    public SampleClass SampleMethod ( SampleClass sampleParameter )
    {
        return new SampleClass { MyProperty1 = Guid.NewGuid(), MyProperty2 = ObjectId.GenerateNewId() };
    }
}

服务界面:

[ServiceContract]
public interface IService
{
    [OperationContract]
    SampleClass SampleMethod ( SampleClass sampleParameter );
}

我的合同类:

/// this class is in DataContracts dll - meantioned in the exception
[DataContract]
public class SampleClass
{
    [DataMember]
    public Guid MyProperty1 { get; set; }
    [DataMember]
    public ObjectId MyProperty2 { get; set; }
}

我将接口和合同保存在单独的库项目中,并在客户端使用dll

MVC Side调用服务:

static IService Service = new ChannelFactory<IService>(new BasicHttpBinding("regularBinding"), new EndpointAddress(BaseAddress + "Service.svc")).CreateChannel();

public ActionResult Index()
{
    var xyz = Service.SampleMethod(new SampleClass());
    return View();
}

我可以从单元测试项目或桌面应用程序中调用此服务。但是当我从MVC应用程序调用该服务时,它会抛出ProtocolException

  

类型&#39; System.ServiceModel.ProtocolException&#39;的例外情况发生在mscorlib.dll中但未在用户代码中处理

     

其他信息:格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数http://tempuri.org/:sampleParameter时出错。 InnerException消息是第1行位置451的错误。&#39; EndElement&#39; &#39; MyProperty2&#39;来自命名空间&#39; http://schemas.datacontract.org/2004/07/DataContracts&#39;不是预期的。期待元素&#39; _increment&#39;。&#39;。有关详细信息,请参阅InnerException。

我有一种预感,这是由一些serializer相关问题引起的,但我对这些主题并不是很了解,所以我就是这样。

这种行为可能是什么原因?如何在不改变数据结构的情况下克服这个问题?

更新

顺便说一下,我意识到返回时会发生异常。当我从服务方法中抛出异常时,该异常会传播给客户端。因此,我可以说我的ObjectId请求可以从服务中接收,但无法返回给客户。

1 个答案:

答案 0 :(得分:0)

我们在与@jpgrassi的讨论中发现了问题和解决方案,但由于@jpgrassi太谦虚而无法发布答案,我在这里。

根据this question @ jeff的回答,答案足以激励我查看MongoDB.Bson dll的版本。它就是这样,它们在服务器和mvc客户端上有所不同并导致了这个问题。在版本上调整它们可以解决问题。