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

时间:2015-09-22 20:24:21

标签: c# asp.net session

我使用以下代码来计算我的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();
    }
}

“只需​​使用性能计数器!”

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

2 个答案:

答案 0 :(得分:1)

在两种情况下调用Session_End:

  • 调用Session.Abandon()时
  • 会议结束后立即

如果您关闭浏览器,会话到期时会触发Seesion_End事件 见MSDN lib

答案 1 :(得分:0)

除非您在Session词典中存储内容,否则会话实际上不会开始。因此,对于没有实际分配会话对象的任何事件,您将不会获得Session_End事件。

来自MSDN

  

使用基于cookie的会话状态时,在使用Session对象之前,ASP.NET不会为会话数据分配存储空间。结果,为每个页面请求生成新的会话ID,直到访问会话对象。如果您的应用程序需要整个会话的静态会话ID,您可以在应用程序的Global.asax文件中实现Session_Start方法,并将数据存储在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: Session.SessionID changes between requests