【问题标题】:Writing to database on session_End event在 session_End 事件上写入数据库
【发布时间】: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


【解决方案1】:

我知道这可能与现有的解决方案不符,但也许您可以查看另一种跟踪使用情况的解决方案,例如 Google Analytics - 因为他们已经在他们的平台上投入了大量精力。

您还可以将您的解决方案与 Google Analytics(分析)集成,以根据需要将摘要信息提取回您的解决方案中。这意味着您也不需要在本地存储所有跟踪信息,而只需根据需要通过其 API 发出请求。

我发现 API 难以集成,但现在可以在解决方案中使用它。

如果您必须在本地进行跟踪,为什么不异步执行此操作,这样您就不会占用 UI 线程 - 这样对性能的影响应该最小?

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多