3

语境

我正在使用 WCF 配置,试图启用可靠的会话。

当可靠会话被禁用时,一切都按预期工作,客户端可以成功连接到服务器。我一放入enabled="true"服务<reliableSession>的Web.config和客户端的App.config,当客户端尝试打开连接时会抛出以下异常:

由于. _ _ ContractFilter_ EndpointDispatcher这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。

Stack Overflow 上有很多关于这个异常的问题,但似乎没有一个答案适用。例如,我检查了receiveTimeoutandinactivityTimeout是相同的,上下文模式是PerSessionservice 和 client-side等。

这是痕迹。你会在我的配置下面找到。它出什么问题了?

痕迹

在此处输入图像描述

  • 红色的例外是我上面引用的那个。
  • 之前收到的消息是一个CreateSequence.
  • 在异常之后发送的消息是addressing/fault消息,旨在将异常传播给客户端。

服务端配置

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  <bindings>
    <netTcpBinding>
      <binding name="netTcpEndpoint" sendTimeout="00:10:00" receiveTimeout="00:10:00">
        <reliableSession ordered="true" enabled="true" inactivityTimeout="00:10:00" />
        <security mode="Message">
          <message clientCredentialType="None" />
        </security>
      </binding>
    </netTcpBinding>
  </bindings>
  <services>
    <service behaviorConfiguration="DebugOrientedBehavior" name="Demo.PipeService">
      <endpoint address="Default.svc" binding="netHttpBinding"
        name="TransportLayerServiceEndpoint" contract="Demo2.IPipeService" />
      <host>
        <baseAddresses>
          <add baseAddress="http://[removed the public URI of the service]/Default.svc" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <serviceBehaviors>
      <behavior name="DebugOrientedBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

客户端配置

<system.serviceModel>
  <bindings>
    <netTcpBinding>
      <binding name="netTcpEndpoint" sendTimeout="00:10:00" receiveTimeout="00:10:00">
        <reliableSession ordered="true" inactivityTimeout="00:10:00" />
        <security>
          <message clientCredentialType="None" />
        </security>
      </binding>
    </netTcpBinding>
    <netHttpBinding>
      <binding name="TransportLayerServiceEndpoint">
        <reliableSession ordered="true" enabled="true" />
        <webSocketSettings transportUsage="Always" />
      </binding>
    </netHttpBinding>
  </bindings>
  <client>
    <endpoint address="ws://[removed the public URI of the service]/Default.svc/Default.svc"
      binding="netHttpBinding" bindingConfiguration="TransportLayerServiceEndpoint"
      contract="PipeServiceReference.IPipeService" name="TransportLayerServiceEndpoint" />
  </client>
</system.serviceModel>
4

1 回答 1

3

在服务器配置 enspoint 添加:

bindingConfiguration="netTcpEndpoint"

当前绑定配置未附加到端点,因此使用默认的 net tcp 设置。在你做出改变之前很好,但现在没有了。

于 2013-09-03T20:51:55.307 回答