WCF ContractFilter 不匹配

Posted

技术标签:

【中文标题】WCF ContractFilter 不匹配【英文标题】:WCF ContractFilter mismatch 【发布时间】:2014-08-22 03:55:49 【问题描述】:

我在 IIS 上托管 WCF 服务。我可以用我的浏览器访问 wsdl 文件。我还可以在 Visual Studio 中为我的客户添加服务引用。

但是,如果我尝试调用 Server.Test(),则会引发 ActionNotSupportedException:

带有 Action 'http://tempuri.org/IWCFService/Test' 的消息 由于 ContractFilter 不匹配,无法在接收方处理 在 EndpointDispatcher。这可能是因为合同 mismatch(发送方和接收方之间的操作不匹配)或 发送方和接收方之间的绑定/安全不匹配。查看 发送者和接收者具有相同的合同和相同的绑定 (包括安全要求,例如消息、传输、无)。

我定义了两个端点:一个 TCP.NET 用于服务和客户端之间的通信,一个 HTTP 用于元数据交换。

服务器配置 (web.conf)

<services>
  <service behaviorConfiguration="MyBehavior"
  name="WCFServiceLibrary.Service.WCFService">
    <endpoint address=""
          binding="netTcpBinding"
          bindingConfiguration="MyServiceEndpoint"
          name="MyServiceEndpoint"
          contract="WCFServiceLibrary.Contract.IWCFService">
    </endpoint>

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

    <host>
      <baseAddresses>
        <add baseAddress="http://192.168.0.5:8080/Service.svc" />
      </baseAddresses>
    </host>
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="MyBehavior">
      <serviceMetadata httpGetEnabled="false" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端配置 (app.conf)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="MyServiceEndpoint">
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <client>
      <endpoint address="net.tcp://192.168.0.5:808/Service.svc" binding="netTcpBinding"
          bindingConfiguration="MyServiceEndpoint" contract="ServiceReference.IWCFService"
          name="MyServiceEndpoint" />
    </client>

  </system.serviceModel>
</configuration>

在 IIS 中,我设置了 net.tcp (808:*) 绑定以及 http (8080) 绑定。

【问题讨论】:

【参考方案1】:

抱歉,我没有任何反应,但如果我建议您在客户端上设置跟踪,它应该会告诉您实际问题是什么:

http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx

顺便说一句,现在的趋势似乎是在客户端引用合同 dll 而不是使用 wsdl。

【讨论】:

我试图为 WCF 的乐趣。你可以用配置更新你的问题,也许我会跳出一些东西,或者开始一个新问题。如果您打算经常使用这项服务,那么绝对值得让它发挥作用。【参考方案2】:

wcf 服务的 web.config 中的基地址不应该是:

<host>
      <baseAddresses>
        <add baseAddress="http://192.168.0.5:8080/Service.svc" />
      </baseAddresses>
</host>

是“net.tcp://...”

<host>
      <baseAddresses>
        <add baseAddress="net.tcp://192.168.0.5:8080/Service.svc" />
      </baseAddresses>
</host>

【讨论】:

【参考方案3】:

简单的重启服务器就可以了!

【讨论】:

以上是关于WCF ContractFilter 不匹配的主要内容,如果未能解决你的问题,请参考以下文章

EndpointDispatcher 错误处的 WCF ContractFilter 不匹配

启用可靠会话时 WCF ContractFilter 不匹配

EndpointDispatcher 的 ContractFilter 不匹配(错误处理)

EndpointDispatcher 的 ContractFilter 不匹配?

由于 EndpointDispatcher 的 ContractFilter 不匹配,接收方无法处理带有 Action '' 的消息。

我们是不是需要在 WCF 服务器和客户端中指定相同的绑定?