代码之家  ›  专栏  ›  技术社区  ›  TomTom

WCF:如何知道会话何时结束?

  •  5
  • TomTom  · 技术社区  · 16 年前

    会话结束时是否有任何中心事件要抛出?如果没有(!)如何确定会话何时结束调用方法(网络断开连接,客户端崩溃-所以没有“注销”方法调用)?

    服务器托管为:

    [ServiceBehavior(
        InstanceContextMode = InstanceContextMode.PerSession,
        ConcurrencyMode = ConcurrencyMode.Reentrant,
        UseSynchronizationContext = false,
        IncludeExceptionDetailInFaults = true
    )]
    

    基本上是因为它使用回调接口。

    现在,我基本上需要在会话终止时解除从后端存储创建的实例;)

    有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  9
  •   HelloSam    12 年前
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    class MyService : IService
    {
        public MyService()
        {
            // Session opened here
            OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed;
            // get the callback instance here if needed
            // OperationContext.Current.GetCallbackChannel<IServiceCallback>()
        }
    
        private void InstanceContext_Closed(object sender, EventArgs e)
        {
            // Session closed here
        }
    }
    

    该代码不适用于Single/PerCall InstanceContextMode。

        2
  •  4
  •   Shiraz Bhaiji    16 年前

    对实例上下文有很好的描述 here

    实例上下文派生自 CommunicationObject

    通信对象具有 closing 事件。

    我自己并没有这样做,但理论上应该可以使用此事件在会话关闭时通过挂接到该事件来与后端存储区分离。

        3
  •  -1
  •   DavyMac23    16 年前

    设置超时值并创建一个PingService()方法,该方法将在超时结束前触发,这将重置发送和接收超时。

    如果您想捕捉超时,只需尝试回调,如果尝试所用时间超过绑定SendTimeout值(我想默认值是1分钟),那么您将抛出一个超时错误,您可以处理断开连接。

    无法优雅地捕捉断开连接的用户(浏览器崩溃、断电等)