语境
我正在使用 WCF 配置,试图启用可靠的会话。
当可靠会话被禁用时,一切都按预期工作,客户端可以成功连接到服务器。我一放入enabled="true"
服务<reliableSession>
的Web.config和客户端的App.config,当客户端尝试打开连接时会抛出以下异常:
由于. _ _
ContractFilter
_EndpointDispatcher
这可能是因为合约不匹配(发送方和接收方之间的操作不匹配)或发送方和接收方之间的绑定/安全不匹配。检查发送方和接收方是否具有相同的合同和相同的绑定(包括安全要求,例如消息、传输、无)。
Stack Overflow 上有很多关于这个异常的问题,但似乎没有一个答案适用。例如,我检查了receiveTimeout
andinactivityTimeout
是相同的,上下文模式是PerSession
service 和 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>