无法通过 wcf 将 mongodb objectId 公开给 mvc

Cannot expose mongodb objectId through wcf to mvc

我在提供 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 );
}

还有我的合同class:

/// 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; }
}

我将界面和合同保存在单独的库项目中,并在客户端使用 dlls。

服务的MVC侧调用:

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:

An exception of type 'System.ServiceModel.ProtocolException' occurred in mscorlib.dll but was not handled in user code

Additional information: The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:sampleParameter. The InnerException message was 'Error in line 1 position 451. 'EndElement' 'MyProperty2' from namespace 'http://schemas.datacontract.org/2004/07/DataContracts' is not expected. Expecting element '_increment'.'. Please see InnerException for more details.

我预感这是由一些 serializer 相关问题引起的,但我对这些主题并没有真正深入的了解,所以我来了。

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

更新

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

我们在与@jpgrassi 的讨论中找到了问题和解决方案,但由于@jpgrassi 太谦虚了post 答案,我在这里。

遵循 this question @jeff 的回答非常鼓舞人心,让我检查了 MongoDB.Bson dll 的版本。就是这样,它们在服务器和 mvc 客户端上是不同的,导致了这个问题。在一个版本上调平它们解决了这个问题。