【问题标题】:How to deal with faulted state in a WCF duplex service with sessions enabled如何在启用会话的 WCF 双工服务中处理故障状态
【发布时间】:2011-08-10 05:22:16
【问题描述】:

我有一个启用了会话的双工 WCF 服务,我正在尝试避免客户端出现故障状态异常。

我发现了几个围绕这个主题的讨论,但我发现的所有内容都建议重新创建客户端代理或通道。 Non 专注于启用会话的双工服务。

我对这种方法的问题是服务器中的每个客户端都有一个会话,并且每个客户端只有一个服务代理实例(单例服务代理)。因为它是双工的,所以在客户端有几个对象正在监听该服务实例上的事件(从服务器发送到客户端的消息)。 如果服务处于故障状态,则不能再使用。如果我丢弃该实例并创建一个新实例,我会发现很难将所有事件处理程序再次连接到这个新实例。

我是否应该包装服务,并且每次一个对象连接到一个事件时,将处理程序存储在一个列表中(以便在重新创建服务时我可以重新连接它)?好像丢了代码,容易泄露内存……

有没有办法只重新启动客户端代理/通道,而不丢弃所有代理实例? (我用的是VS生成的代理)

有什么想法吗?

谢谢, 单克隆抗体

【问题讨论】:

    标签: wcf wcf-client wcf-sessions


    【解决方案1】:

    您无法重新启动代理。从故障状态中恢复的唯一方法是中止当前实例并重新创建新实例。在客户端,您必须正确取消注册依赖于您的代理实例的所有内容,创建新实例并再次注册所有内容。一旦您获得有关通道处于故障状态的异常(=当您尝试调用服务时),就必须执行整个操作。娱乐后,您必须再次调用该服务。

    在服务端,实例要么已经死亡(导致通道出现故障状态),要么在会话超时后死亡。当您尝试通过从已知客户端删除通道并取消注册依赖于该通道的任何内容来尝试回调故障通道时,您还必须处理故障异常。

    【讨论】:

    • 坏消息,所以我必须编写所有代码:-( 不过,这似乎是每个使用启用了会话的服务的应用程序都需要解决的问题。有人知道一些库吗我可以重复使用吗?
    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2014-06-27
    相关资源
    最近更新 更多