我在提供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
请求可以从服务中接收,但无法返回给客户。
答案 0 :(得分:0)
我们在与@jpgrassi的讨论中发现了问题和解决方案,但由于@jpgrassi太谦虚而无法发布答案,我在这里。
根据this question @ jeff的回答,答案足以激励我查看MongoDB.Bson
dll的版本。它就是这样,它们在服务器和mvc客户端上有所不同并导致了这个问题。在版本上调整它们可以解决问题。