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