如何从服务端终止会话?

时间:2012-06-27 14:52:35

标签: c# .net wcf

假设您已经创建了一个双工服务 - 例如使用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状态。

我得到的行为几乎是我想要的,但我不确定这是否是确切的方法。

1 个答案:

答案 0 :(得分:2)

如果你想关闭会话dut到不活动,你可以更好地利用可靠的会话不活动超时http://msdn.microsoft.com/en-us/library/system.servicemodel.reliablesession.inactivitytimeout.aspx,这里基础设施会自动为你关闭会话。否则,对于手动方法,您可以尝试OperationContext.Current.InstanceContext.Close()或OperationContext.Current.InstanceContext.Abort()