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

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

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

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

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

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

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

相关:

【问题讨论】:

    标签: wcf


    【解决方案1】:

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

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

    取自CommunicationState

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

    更多关于state changes的信息。

    【讨论】:

    • 您知道如何使用无会话通道导致“不可恢复的错误”吗?您能否举一个 Open 方法失败并且客户端通道转换为故障状态的示例?另外,您为什么说“当没有传输级会话时,客户端可以在出现异常后继续使用代理,但又一次,它不应该”。为什么不呢?
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2014-01-30
    • 1970-01-01
    • 2018-02-08
    • 2012-06-10
    相关资源
    最近更新 更多