WCF合同不匹配问题

我有一个客户端控制台应用程序与WCF服务通信,我收到以下错误:“服务器没有提供有意义的答复;这可能是由合同不匹配,过早的会话关闭或内部服务器错误引起的。”

我认为这是因为合同不匹配但我无法弄清楚原因。 该服务本身运行良好,两个部分一起工作,直到我添加了模拟代码。

任何人都可以看到有什么问题?

这是客户端,全部用代码完成:

NetTcpBinding binding = new NetTcpBinding(); binding.Security.Mode = SecurityMode.Message; binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; EndpointAddress endPoint = new EndpointAddress(new Uri("net.tcp://serverName:9990/TestService1")); ChannelFactory channel = new ChannelFactory(binding, endPoint); channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; IService1 service = channel.CreateChannel(); 

这是WCF服务的配置文件:

                                         

其他可能的原因:

  • 尝试在没有默认构造函数的情况下序列化对象。
  • 尝试序列化其他类型的非可序列化对象(例如exception)。 要防止项目被序列化, [IgnoreDataMember]属性应用于字段或属性。
  • 检查枚举字段以确保它们设置为有效值(或可以为空)。 在某些情况下,您可能需要向枚举添加0值。 (不确定这一点的细节)。

测试内容:

  • 至少为严重错误或exception配置WCF跟踪 。 如果启用任何进一步的跟踪,请注意观察文件大小。 在许多情况下,这将提供一些非常有用的信息。

    只需在服务器上web.config 下添加它。 如果log目录不存在,请创建它。

           
  • 确保.svc文件实际上会在浏览器中出现而不会出错。 这将为您提供一些“第一次机会”帮助。 例如,如果您有一个非序列化对象,您将在下面收到此消息。 请注意,它清楚地告诉您什么不能序列化。 确保启用了“mex”端点并在浏览器中显示.svc文件。

ExceptionDetail,可能由IncludeExceptionDetailInFaults = true创建,其值为:System.InvalidOperationException:在调用WSDL导出扩展时抛出exception:System.ServiceModel.Description.DataContractSerializerOperationBehavior contract: http ://tempuri.org/: IOrderPipelineService —-> System.Runtime.Serialization.InvalidDataContractException: 类型’RR.MVCServices.PipelineStepResponse’无法序列化。 请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。

对我来说,抛出此错误消息是因为我的web.config服务行为默认情况下具有较低的消息限制,因此当WCF返回说200000字节且我的限制为64000字节时,响应被截断,因此您得到“..没有意义的答复“。 它有意义,它被截断并且无法解析。

我将粘贴修复此问题的web.config更改:

             

maxItemsInObjectGraph值是最重要的!
我希望这可以帮助任何人。

我遇到了类似的问题。 在花了2个小时思考并尝试在线找到答案后,我决定使用System.Runtime.Serialization.DataContractSerializer按照方法对服务器端的返回值/对象进行seralize和反序列化,最后发现我错过了在其中一个枚举上添加EnumMember属性。

您可能面临类似的问题。

以下是帮助我解决问题的代码段:

  var dataContractSerializer = new System.Runtime.Serialization.DataContractSerializer(typeof(MyObject)); byte[] serializedBytes; using (System.IO.MemoryStream mem1 = new System.IO.MemoryStream()) { dataContractSerializer.WriteObject(mem1, results); serializedBytes = mem1.ToArray(); } MyObject deserializedResult; using (System.IO.MemoryStream mem2 = new System.IO.MemoryStream(serializedBytes)) { deserializedResult = (MyObject)dataContractSerializer.ReadObject(mem2); } 

好吧,我刚刚更改了客户端,因此它使用配置文件而不是代码,我得到了同样的错误!

码:

 ServiceReference1.Service1Client client = new WCFTest.ConsoleClient.ServiceReference1.Service1Client("NetTcpBinding_IService1"); client.PrintMessage("Hello!"); 

这是客户端的配置文件,刚从服务中生成…这使我认为它可能不是合同不匹配错误

                                       

如果在WCF中有两个具有相同名称和参数的方法,则会抛出此错误