代码之家  ›  专栏  ›  技术社区  ›  Rob Cooper

“HttpContext.Current.Session”vs Global.asax“this.Session”

  •  13
  • Rob Cooper  · 技术社区  · 17 年前

    最近,在为一个ASP.NET项目编写代码时。我们需要一个跟踪工具来获取用户活动的基本指标(页面点击数等),我们将在其中跟踪它们 Session ,然后通过将数据保存到数据库 Session_End Global.asax .

    我开始破解,最初的代码运行良好,在每次加载页面时更新数据库。但是我想在每个请求上删除这个DB命中,并且仅仅依靠 会议结束 以存储所有数据。

    所有跟踪代码都封装在 Tracker 类,包括基本上包装会话变量的属性。

    问题 Tracker.Log() 会议结束 HttpContext.Current.Session 在“跟踪器”中,代码因错误而失败 NullReferenceException . 现在,这是有道理的,因为 HttpContext 现在的 请求,当然还有

    我知道 Global.asax 有一个 返回 HttpSessionState 这实际上似乎工作得很好(我最后把它注射到了跟踪器中)。。

    HttpSessionState 所使用的对象 从…起 属于 ?

    提前感谢各位,我感谢你们的意见。:)

    7 回复  |  直到 17 年前
        1
  •  18
  •   IDisposable    12 年前

    为了更好地回答原来的问题:

    出身背景

    每一个页面请求都会产生一个新的页面 Session 对象,然后从会话存储中将其充气。为此,它使用客户端提供的cookie或特殊路径构造(用于无cookie会话)。使用此会话标识符,它将查询会话存储并反序列化(这就是为什么除InProc之外的所有提供程序都需要可序列化)新会话对象。

    HttpCache 由会话标识符设置密钥。 这就是InProc提供程序在 AppDomain .

    这个新创建并膨胀的对象被卡在 Context.Items 以使其在请求期间可用。

    您对 然后,在请求结束时,通过序列化将对象持久化到会话存储区(对于InProc,则为 条目已更新)。

    自从 Session_End 在fly中没有当前请求的情况下激发 对象以零速度旋转,没有可用信息。如果使用InProc会话状态,则 HttpCache 将回调事件触发到 会议结束 事件,因此会话条目可用,但仍然是上次存储在中的内容的副本 HttpContext.Cache . 此值存储在 HttpApplication.Session 属性由内部方法(称为 ProcessSpecialRequest )如果可以的话。在所有其他情况下,它内部来自 HttpContext.Current.Session

    你的回答

    HttpContext.Current.Session 然后传递到跟踪代码中。 但是,让跟踪代码访问会话上下文。

    我的回答

    不要使用 除非您知道您正在使用的会话存储支持 会议结束 ,这是什么 如果它回来 true 从…起 SetItemExpireCallback . 盒子里唯一能做的就是 InProcSessionState 百货商店可以编写一个会话存储,它只处理谁将处理该会话的问题 会议结束 如果有多个服务器,则有点不明确。

        2
  •  11
  •   Zhaph - Ben Duguid    17 年前

    Global.asax实现了HttpApplication,这就是您在呼叫时所说的内容

    的MSDN文档 HttpApplication 详细介绍了如何在HttpHandler中获取它,然后访问它的各种属性。

    然而

    您的应用程序可以创建多个HttpApplication实例来处理并行请求,并且这些实例可以重复使用,因此以某种方式获取它并不能保证您拥有正确的实例。

        3
  •  4
  •   M4N    17 年前

    我想您已经回答了自己的问题:通常Global.asax和HttpContext.Current.Session中的Session属性是相同的(如果存在当前请求)。但是在会话超时的情况下,没有活动请求,因此不能使用HttpContext.Current。

    如果要从session_End调用的方法访问会话,请将其作为参数传递。使用Log()方法创建一个重载版本,该方法将HttpSessionState作为参数,然后从会话结束事件处理程序调用Tracker.Log(this.Session)。

        4
  •  3
  •   Shahrokhian    13 年前

    这个 Session_End 事件仅在 sessionstate mode 设置为 InProc Web.config StateServer SQLServer

    使用 Session["SessionItemKey"]

        5
  •  0
  •   Shan Shan    16 年前

    -掸

        6
  •  0
  •   brumScouse    14 年前

        7
  •  -1
  •   IDisposable    17 年前

    请记住,会话结束时,会话将在没有活动的情况下超时。浏览器不会发起该事件(因为它处于非活动状态),因此只有在使用InProc提供程序时才能真正获得该事件。在其他所有提供程序中,此事件永远不会触发。

    道德的不要使用会话结束。

    推荐文章