【发布时间】:2014-05-22 11:34:15
【问题描述】:
我正在写一个HttpModule 来根据用户当前的会话跟踪用户的页面浏览量。
除了用户放弃会话外,我的模块工作正常。示例场景:
- 会话超时为 20 分钟
- 用户浏览网站 15 分钟
- 用户离开网站
- 现在不会为该用户触发会话结束事件,因为他们已离开网站
我想挂接到 Session End 事件,这样我就可以为用户批量更新页面视图,而不是在每次用户点击页面时都这样做(在性能方面没有那么好)。
有没有办法检测何时发生这种情况,然后触发一个事件/一段代码来记录视图?
需要示例代码:
public void Init(HttpApplication application)
{
application.PostRequestHandlerExecute += application_PostRequestHandlerExecute;
SessionStateModule session = (SessionStateModule)application.Modules["Session"];
session.Start += session_Start;
session.End += session_End;
}
void session_End(object sender, EventArgs e)
{
Visitor visitor = HttpContext.Current.Session["visitor"] as Visitor;
if (visitor != null)
{
foreach (PageItem page in visitor.Pages)
{
page.UpdatePageViews();
}
}
}
【问题讨论】:
-
请注意 a) Session_End 直到最后一次请求后 20 分钟才会触发(而不是当用户“导航离开”时); b)它只会为“inproc”会话(这是默认设置)触发。另外:Session_End 没有“当前 httpcontext”——它不会作为请求的一部分触发。
标签: c# asp.net session session-timeout httpmodule