有没有办法让无会话 WCF 通道出错?

Posted

技术标签:

【中文标题】有没有办法让无会话 WCF 通道出错?【英文标题】:Is there a way to fault a session-less WCF channel? 【发布时间】:2015-08-08 14:13:36 【问题描述】:

如果我有一个无会话绑定,在任何情况下 客户端 通道会出错?

在我的具体情况下,我有以下自定义绑定:

<customBinding>
  <binding name="MyCustomBinding">
    <mtomMessageEncoding/>
    <httpTransport/>
  </binding>
</customBinding>

在客户端,我使用从ClientBase&lt;T&gt; 派生的默认生成代理。

我期待如果服务抛出一个不是FaultException 的未处理异常,它会导致通道出现故障并导致客户端代理出现故障。然而,事实并非如此——代理仍然保持在 Open 状态并且之后可以使用。我还尝试违反绑定的超时之一——这也没有导致通道故障,客户端代理仍处于打开状态。

是否有任何情况会导致客户端代理出现故障?

相关:

Custom WCF Binding Suppresses Fault

【问题讨论】:

【参考方案1】:

当发生不可恢复的错误时,ClientChannel 将转换为故障状态。在这种状态下不再可用。恢复策略是创建一个新对象。主要原因是

如果 Open 方法因任何原因失败,则对象将转换为错误状态。 如果基于会话的通道检测到无法恢复的错误,则会转换到故障状态。例如,如果存在协议错误(即,它在无效时间收到协议消息)或远程端点中止会话,则可能发生这种情况。

取自CommunicationState

基于会话的是指传输会话。所以任何未处理的异常都会使通道出错,以防止在异常发生后再次使用代理。当没有传输级会话时,客户端可以在异常发生后继续使用代理,除非再次例外。

更多关于state changes的信息。

【讨论】:

您知道如何使用无会话通道导致“不可恢复的错误”吗?您能否举一个 Open 方法失败并且客户端通道转换为故障状态的示例?另外,您为什么说“当没有传输级会话时,客户端可以在出现异常后继续使用代理,但又一次,它不应该”。为什么不呢?

以上是关于有没有办法让无会话 WCF 通道出错?的主要内容,如果未能解决你的问题,请参考以下文章

WCF会话

ASP.NET 中的 REST WCF 服务和会话

WCF 可靠会话的目的是啥?

WCF 会话 ASP.NET 托管问题

快速入门系列--WCF--02消息会话与服务寄宿

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