我有一个WCF服务器,它使用双工模型维护对客户端回调的引用。
如果我明确关闭服务器上的回调连接:
ICallBack callBack = OperationContext.Current.GetCallbackChannel<ICallBack>();
callBack.Close()
客户未能通过订阅以下任一方式接收此事件的通知:
client.InnerChannel.Closed += Handler;
client.InnerDuplexChannel.Closed += Handler;
两个事件处理程序都没有执行。
但是,如果我在服务器端将回调更改为Abort
而不是Close
,则客户端会收到Faulted
处理程序的通知,然后是{{1处理程序。因此,流产按预期进行。
我已检查回调是否处于有效状态,那么为什么客户端会在Closed
上收到Faulted
通知,而不是Abort
上的Closing
通知}}? Close
之后的回调状态为Close
。
根据MSDN documentation优雅地关闭使用Closed
的回调连接,我会选择更突然的Close
。
答案 0 :(得分:0)
因为您正在将它转换为您自己的接口,我假设它实现了Close(),这不会触发WCF事件。
你需要这样做:
IClientChannel pClientChannel = (IClientChannel) callback;
pClientChannel.Close();
简化了。你真的应该做try / catch Close / Abort模式。如果关闭不起作用,请在其上调用abort。