我可以列出所有活动会话ID';来自c#windows服务的web应用程序是什么?

我可以列出所有活动会话ID';来自c#windows服务的web应用程序是什么?,c#,iis-7,C#,Iis 7,我们对应用程序上的用户进行时间跟踪,并希望在用户注销或会话超时时给他们打卡。注销没有问题,会话超时在95%的时间内有效。但是5%的时间要么会话结束没有被调用,要么我丢失了用户将其用户ID传递到数据库以进行打卡的会话 下面是我在Global.asax中的代码: protected void Session_End(object sender, EventArgs e) { var currentUser = Session[Constants.Se

我们对应用程序上的用户进行时间跟踪,并希望在用户注销或会话超时时给他们打卡。注销没有问题,会话超时在95%的时间内有效。但是5%的时间要么会话结束没有被调用,要么我丢失了用户将其用户ID传递到数据库以进行打卡的会话

下面是我在Global.asax中的代码:

     protected void Session_End(object sender, EventArgs e)
        {
            var currentUser = Session[Constants.SessionKey_User] as User;

            if (currentUser != null)
            {
                //passes the user id to a db proc
                Utilities.LogTimeTrackingEvent(currentUser.UserId, Constants.TimeTrackingEntryTypes.Stop);   
             }         
        }

其思想是设置一个web服务,每十分钟对所有活动会话轮询一次web服务器(IIS 7),并将其与存储在数据库中的会话ID进行比较。对于web服务器列表中未列出的所有会话ID,请将这些用户注销。这是否合理?这听起来是否合理?谢谢。

我想弄清楚为什么不叫会议结束会更容易。完全同意。似乎没有什么模式可以解释为什么它没有被调用,谷歌搜索它也没有产生任何有用的结果。@JeffBorden:你的应用程序池工作者进程回收设置是什么?默认情况下,它每1740分钟循环一次?因此,当有用户连接时,可能会发生这种情况,导致他们丢失会话。当然,当工作进程重新启动时,不会调用会话结束事件。@thecoon:这很有趣。间隔超时实际上是1740。是否有一种推荐的方法可以执行与我在会话结束时尝试的类似的清理?@JeffBorden:是的,通常这应该设置为您相对确信不会有任何活动的时间。比如晚上,或者清晨。取决于您正在运行的网站类型。所以应该是每天,在固定的时间(通常)。我想这会更容易弄清楚为什么没有呼叫会话结束。完全同意。似乎没有什么模式可以解释为什么它没有被调用,谷歌搜索它也没有产生任何有用的结果。@JeffBorden:你的应用程序池工作者进程回收设置是什么?默认情况下,它每1740分钟循环一次?因此,当有用户连接时,可能会发生这种情况,导致他们丢失会话。当然,当工作进程重新启动时,不会调用会话结束事件。@thecoon:这很有趣。间隔超时实际上是1740。是否有一种推荐的方法可以执行与我在会话结束时尝试的类似的清理?@JeffBorden:是的,通常这应该设置为您相对确信不会有任何活动的时间。比如晚上,或者清晨。取决于您正在运行的网站类型。所以它应该是每天,在一个固定的时间(通常)。