我有启用会话的双工WCF服务,我正在尝试避免客户端上的错误状态异常。
我发现了围绕这个主题的几个讨论,但我发现建议重新创建客户端代理或通道。 Non是关注启用会话的双工服务。
我的问题是,服务器中每个客户端有一个会话,每个客户端只有一个服务代理实例(单例服务代理)。因为它是双工的,所以在客户端,有几个对象正在侦听该服务实例上的事件(从服务器发送到客户端的消息)。 如果服务处于故障状态,则不能再使用它。如果我丢弃该实例并创建一个新实例,我发现很难将所有事件处理程序再次连接到这个新实例。
我是否应该包装服务,并且每次对象挂钩事件时,将处理程序存储在列表中(这样我可以在重新创建服务时重新挂钩)?似乎丢失了代码,容易泄漏内存......
有没有办法只重新启动客户端代理/通道,而不丢弃所有代理实例? (我正在使用VS生成的代理)
有什么想法吗?
谢谢, MAB
答案 0 :(得分:2)
您无法重新启动代理。从故障状态中唯一的恢复是中止当前实例并重新创建新实例。在客户端,您必须正确取消注册依赖于您的代理实例的所有内容,创建新实例并再次注册所有内容。一旦获得有关故障状态的通道的异常(=当您尝试调用服务时),必须执行整个操作。娱乐后,您必须再次拨打该服务。
在服务端,实例已经死亡(导致通道出现故障状态),或者在会话超时后死亡。当您尝试通过从已知客户端删除通道并取消注册依赖于该通道的任何内容来尝试在故障通道上进行回调时,您还必须处理故障异常。