WCF合同不匹配问题如何解决怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (90)

我有一个客户端控制台应用程序与WCF服务通话,并且出现以下错误:“The server did not provide a meaningful reply; this might be caused by a contract mismatch, a premature session shutdown or an internal server error.”

我认为这是因为合同不匹配,但我不明白为什么。该服务本身运行良好,两部分一起工作,直到我添加了模拟代码。

任何人都可以看到什么是错的?

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

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<IService1> channel = new ChannelFactory<IService1>(binding, endPoint);
channel.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
IService1 service = channel.CreateChannel();

这里是WCF服务的配置文件:

<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="MyBinding">
          <security mode="Message">
            <transport clientCredentialType="Windows"/>
            <message clientCredentialType="Windows" />
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFTest.ConsoleHost2.Service1Behavior">
          <serviceMetadata httpGetEnabled="true"  />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceAuthorization impersonateCallerForAllOperations="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="WCFTest.ConsoleHost2.Service1Behavior"
          name="WCFTest.ConsoleHost2.Service1">
        <endpoint address="" binding="wsHttpBinding" contract="WCFTest.ConsoleHost2.IService1">
          <identity>
            <dns value="" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint binding="netTcpBinding" bindingConfiguration="MyBinding"
            contract="WCFTest.ConsoleHost2.IService1" />
        <host>
          <baseAddresses>
            <add baseAddress="http://serverName:9999/TestService1/" />
            <add baseAddress="net.tcp://serverName:9990/TestService1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>
提问于
用户回答回答于

对我来说,这个错误消息是因为我的web.config服务行为默认情况下消息限制很少,所以当WCF返回说200000字节和我的限制是64000字节响应被截断,因此你得到“..没有意义的答复“。这是有意义的,它只是被截断,不能被解析。

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

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="YourNameSpace.DataServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      <serviceTimeouts transactionTimeout="05:05:00" />
      <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500"
       maxConcurrentInstances="2147483647" />
</behavior>
</serviceBehaviors>
</behaviors>

maxItemsInObjectGraph值是最重要的!

用户回答回答于

其他可能的原因:

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

测试内容:

  • 配置WCF跟踪至少发生严重错误或异常。如果启用任何更多跟踪,请小心观看文件大小。这在很多情况下会提供一些非常有用的信息。 只需<configuration>web.config ON THE SERVER中添加此项。log如果该目录不存在,则创建该目录。
 <system.diagnostics>
     <sources>
       <source name="System.ServiceModel"
               switchValue="Error, Critical"
               propagateActivity="true">
         <listeners>
           <add name="traceListener"
               type="System.Diagnostics.XmlWriterTraceListener"
               initializeData= "c:\log\WCF_Errors.svclog" />
         </listeners>
       </source>
     </sources>
   </system.diagnostics>
  • 确保.svc文件实际上会在浏览器中正确显示而不会出错。这会给你一些'第一次机会'的帮助。例如,如果你有一个不可序列化的对象,你会在下面看到这个消息。请注意,它清楚地告诉你什么不能被序列化。确保你启用了“mex”端点,并在浏览器中显示.svc文件。

扫码关注云+社区