天真的ASP.. NET会话计数错误

本文关键字:错误 会话 NET 真的 ASP 天真 | 更新日期: 2023-09-27 18:13:56

我使用以下代码来计算ASP中当前打开的会话的数量。. NET(2.0/3.5)应用程序(ASMX web服务,遗留代码),但是如果它运行的时间足够长,计数就会停止匹配内置的性能计数器(我的计数更高,Session_End有时似乎没有被调用)。会话是InProc的。我可能错过了什么?

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        Application["OpenSessionCount"] = 0;
    }
    protected void Session_Start(Object sender, EventArgs e)
    {
        Application.Lock();
        Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] + 1;
        Application.UnLock();
        /* Set other Session["foo"] = bar data */
    }
    protected void Session_End(Object sender, EventArgs e)
    {
        Application.Lock();
        Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] - 1;
        Application.UnLock();
    }
}

"使用性能计数器!"

是的,我只是想问问,因为我很好奇我哪里出错了。

天真的ASP.. NET会话计数错误

在两种情况下调用Session_End:

  • 当Session.Abandon()被调用
  • 会话过期后立即

如果你关闭浏览器,Seesion_End事件会在Session过期时触发。
参见MSDN lib

会话实际上并不开始,除非您在Session字典中存储了一些内容。因此,对于没有实际分配会话对象的任何对象,您都不会获得Session_End事件。

从MSDN:

当使用基于cookie的会话状态时,ASP。NET在使用session对象之前不会为会话数据分配存储空间。因此,在访问会话对象之前,将为每个页面请求生成一个新的会话ID。如果应用程序需要整个会话的静态会话ID,则可以在应用程序的Global中实现Session_Start方法。asax文件并将数据存储在Session对象中以固定会话ID,或者您可以使用应用程序的其他部分的代码显式地将数据存储在Session对象中。

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        Application["OpenSessionCount"] = 0;
    }
    protected void Session_Start(Object sender, EventArgs e)
    {
        Application.Lock();
        // Store something every time to ensure the Session object is allocated.
        HttpContext.Current.Session["dummy"] = "Foo";
        Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] + 1;
        Application.UnLock();
        /* Set other Session["foo"] = bar data */
    }
    protected void Session_End(Object sender, EventArgs e)
    {
        Application.Lock();
        Application["OpenSessionCount"] = (int)Application["OpenSessionCount"] - 1;
        Application.UnLock();
    }
}

参考:ASP。NET:会话。SessionID在请求间的变化