C# 如何从服务端终止会话?

C# 如何从服务端终止会话?,c#,.net,wcf,C#,.net,Wcf,假设您已经创建了一个双工服务(例如使用NetTcpBinding),并将其配置为通过新客户端为每个新订阅创建一个新会话,如下所示:每次新客户端连接时,都会创建一个新的服务实例。如果客户端想要断开连接,它将调用Unsubscribe()方法以结束其会话 还假设服务有一个方法来验证客户机是否处于活动状态——也就是说,客户机必须定期调用此方法:如果服务检测到客户机不再处于活动状态,那么服务决定断开与客户机的连接是有意义的。类似地,如果用户决定关闭承载服务的应用程序,服务可能会决定终止所有会话 如何从

假设您已经创建了一个双工服务(例如使用NetTcpBinding),并将其配置为通过新客户端为每个新订阅创建一个新会话,如下所示:每次新客户端连接时,都会创建一个新的服务实例。如果客户端想要断开连接,它将调用
Unsubscribe()
方法以结束其会话

还假设服务有一个方法来验证客户机是否处于活动状态——也就是说,客户机必须定期调用此方法:如果服务检测到客户机不再处于活动状态,那么服务决定断开与客户机的连接是有意义的。类似地,如果用户决定关闭承载服务的应用程序,服务可能会决定终止所有会话

  • 如何从服务端终止会话
  • 客户机(即自动生成的代理)如何检测服务想要断开连接或正在断开连接?它会引发异常吗
更新

我了解了
ICommunicationObject
接口、
CommunicationObject
类、
IDisposable
接口等,因此我尝试使用与回调相关的
ICommunicationObject

ICommunicationObject obj = (ICommunicationObject)callback;
obj.Close();
通过这种方式,会话实例被彻底销毁(在调用
Close()
方法后调用析构函数
Dispose()
方法),如果客户端尝试发送请求,则会对其启动
ProtocolException

此通道不能再用于将消息作为输出发送 由于服务器启动的关机,会话已自动关闭。任何一个 通过设置 将自动关机关闭为false,或考虑 正在修改与远程服务器的关机协议

类似地,使用上面的代码,但调用
Abort()
方法,服务实例将被销毁,并且在客户端上引发
CommunicationObjectFaultedException
异常:

通信对象System.ServiceModel.Channels.ServiceChannel, 无法用于通信,因为它处于故障状态


我得到的行为与我想要的差不多,但我不确定这是否是正确的继续方式。

如果您想将会话dut关闭为非活动状态,您最好使用可靠的会话非活动超时,这里的基础结构将自动为您关闭会话。否则,对于手动方法,您可以尝试OperationContext.Current.InstanceContext.Close()或OperationContext.Current.InstanceContext.Abort()

因此,我还可以将这些
OperationContext.Current.InstanceContext
对象存储在
静态
共享列表中,以便从另一个线程调用所需的
InstanceContext
。正确吗?如果我在服务实例中调用
Close
Abort
方法,这两个方法都不起作用:它们毫无例外地返回,但连接没有关闭(析构函数
Dispose
没有被调用),客户端仍然能够通信。我还了解了
ReleaseServiceInstance
方法,试图调用它时,它抛出了这个异常:通信对象System.ServiceModel.InstanceContext处于创建状态。除非通信对象处于打开状态,否则无法将其用于通信。实例上下文中的中止/关闭必须引发异常和故障客户端通道。或者,您可以手动从服务器抛出异常,即使这会导致客户端上的通道出现故障,并强制它们创建新代理。当我调用
ReleaseServiceInstance()
方法时,上述异常会在服务实例中启动。