WCF调用GetCallbackChannel<T>是否可靠 能否避免CommunicationException
问题解答
若我无需使用此类缓存机制,直接调用
GetCallbackChannel<T>向客户端发起事件调用,是否可以保证内部列表仅包含所有已连接客户端且在调用对应事件时永远不会抛出对应的CommunicationException?
答案是否定的,没有任何机制可以做这个保证,具体原因如下:
GetCallbackChannel<T>的作用仅为获取当前正在处理的客户端请求对应的单个回调通道代理,WCF框架本身不会主动维护全局的全量已连接客户端回调列表,你如果要向多客户端广播事件,不自行维护缓存的话根本拿不到其他客户端的回调通道,只能回消息给当前发起请求的这一个客户端。- 即便你仅向当前请求对应的客户端回发消息,也完全可能抛出通信异常:客户端可能在你获取回调通道到实际发起调用的时间差里主动断开、进程崩溃、网络中断,这类场景下调用回调方法必然触发
CommunicationException或ObjectDisposedException等异常。 - 哪怕你提前检查回调通道的
State属性为Opened也无法完全避免异常,因为状态检查和方法调用的间隙仍然可能发生连接中断,通信异常是不可避免的,必须显式加try-catch捕获,捕获到异常后及时销毁失效的回调通道即可。
内容的提问来源于stack exchange,提问作者Adrián
相关产品推荐
相关产品推荐

