【问题标题】:How to detect a WCF session crash before calling a contract method?如何在调用合约方法之前检测 WCF 会话崩溃?
【发布时间】:2010-05-21 08:29:49
【问题描述】:

我正在为我的 WCF 服务使用会话模式。问题如下:如果会话被破坏并且不再存在,客户端在调用合约之前无法知道它。

例如,如果服务已重新启动,则客户端的会话 id 无效,因为该会话已在服务器端关闭。

我在调用合约之前检查通道状态,它的值是 CommunicationState.Opened,即使会话已经中断。因此,当我在此检查后调用合同时,我会收到带有以下消息的 CommunicationException:

远程端点不再识别此序列。这很可能是由于远程端点上的中止。 wsrm:Identifier 的值不是已知的序列标识符。可靠会话出现故障。

有什么解决方法吗?我需要一种在调用合约之前获取适当会话状态的方法,这样我就可以在不出现异常的情况下恢复它。

附: CommunicationException 类型是通用的,因此我无法通过捕获此异常来检测会话崩溃。

附言我已经问过类似的问题here,但当时我不知道原因,现在我不知道如何逃避它。

【问题讨论】:

    标签: wcf session-state


    【解决方案1】:

    不,没有解决方法 - 您可以(并且应该做的)就是使用适当的防御性编程原则来捕捉和处理发生的此类异常。

    如果服务器崩溃或网络中断,很遗憾,没有机制可以通知所有潜在客户这种情况 - 他们下次尝试调用时就会发现。

    更新:是的,CommunicationException 只是与 WCF 相关的所有异常的通用基类 - 查看 MSDN docs 以了解您可以捕获的所有后代异常更具体 - EndpointNotFoundException、@ 987654324@(或FaultException<T>)、ProtocolException 等等!

    【讨论】:

    • 是的,看来唯一的办法就是捕捉异常,但是CommunicationException类型太笼统了。
    猜你喜欢
    • 2011-04-25
    • 2013-05-29
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多