假设您已经创建了一个双工服务 - 例如使用NetTcpBinding - 并且被配置为由新客户端为publish-subscribe pattern创建每个新订阅的新会话:每次新客户端连接时,都是新的服务实例已创建。如果客户端想要断开连接,则调用Unsubscribe()
方法就足以结束其会话。
还假设该服务有一种方法来验证客户端是否处于活动状态 - 也就是说,客户端必须定期调用此方法:如果服务检测到客户端不再处于活动状态,则服务决定与客户断开连接。同样,如果用户决定关闭托管它的应用程序,服务可能会决定终止所有会话。
更新
我读到了ICommunicationObject
接口,CommunicationObject
类,IDisposable
接口等等,所以我尝试使用与回调相关的ICommunicationObject
:
ICommunicationObject obj = (ICommunicationObject)callback;
obj.Close();
通过这种方式,干净地销毁会话实例(在调用Dispose()
方法后调用析构函数Close()
方法)并且如果客户端尝试发送请求,则{{1}在它上面启动:
此频道不能再用作发送消息作为输出 由于服务器启动的关闭,会话已自动关闭。或 通过设置禁用自动关闭 DispatchRuntime.AutomaticInputSessionShutdown为false,或者考虑 使用远程服务器修改关闭协议。
类似地,使用上面的代码但是调用ProtocolException
方法,服务实例被销毁,并且客户端抛出Abort()
异常:
通信对象System.ServiceModel.Channels.ServiceChannel, 不能用于通信,因为它处于Faulted状态。
我得到的行为几乎是我想要的,但我不确定这是否是确切的方法。
答案 0 :(得分:2)
如果你想关闭会话dut到不活动,你可以更好地利用可靠的会话不活动超时http://msdn.microsoft.com/en-us/library/system.servicemodel.reliablesession.inactivitytimeout.aspx,这里基础设施会自动为你关闭会话。否则,对于手动方法,您可以尝试OperationContext.Current.InstanceContext.Close()或OperationContext.Current.InstanceContext.Abort()