我使用以下代码来计算我的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();
}
}
“只需使用性能计数器!”
是的,我只是在问,因为我很好奇我哪里出错了。
答案 0 :(得分:1)
答案 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();
}
}