天真的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();
}
}
"使用性能计数器!"
是的,我只是想问问,因为我很好奇我哪里出错了。
在两种情况下调用Session_End:
- 当Session.Abandon()被调用
- 会话过期后立即
如果你关闭浏览器,Seesion_End事件会在Session过期时触发。
参见MSDN lib
会话实际上并不开始,除非您在Session
字典中存储了一些内容。因此,对于没有实际分配会话对象的任何对象,您都不会获得Session_End
事件。
当使用基于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在请求间的变化