从 HTTPModule 访问会话变量

本文关键字:变量 会话 访问 HTTPModule | 更新日期: 2023-09-27 18:31:40

如何从HttpModule访问会话变量?

我在.cs页面中设置了以下会话变量,我想在HttpModule中访问该变量:

会话["用户名"] = "BLAH"

从 HTTPModule 访问会话变量

我建议一种侵入性较小的方法。只需强制运行时使用 SetSessionStateBehavior() 向模块公开会话 ASP.NET(IRequiresSessionState 的实现仅考虑用于 IHttpHandler)。

public void Init(HttpApplication httpApp)
{
   //SESSION WILL BE AVAILABLE IN ALL EVENTS FROM PreRequestHandlerExecute TO PostRequestHandlerExecute
   httpApp.PostRequestHandlerExecute += OnPostRequestHandlerExecute;
   //THIS IS THE IMPORTANT LINE
   httpApp.Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly);
}

下面是在 HttpModule 中使用会话的示例,可在此处找到:

using System;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Diagnostics;
// This code demonstrates how to make session state available in HttpModule,
// regradless of requested resource.
// author: Tomasz Jastrzebski
public class MyHttpModule : IHttpModule
{
   public void Init(HttpApplication application)
   {
      application.PostAcquireRequestState += new EventHandler(Application_PostAcquireRequestState);
      application.PostMapRequestHandler += new EventHandler(Application_PostMapRequestHandler);
   }
   void Application_PostMapRequestHandler(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;
      if (app.Context.Handler is IReadOnlySessionState || app.Context.Handler is IRequiresSessionState) {
         // no need to replace the current handler
         return;
      }
      // swap the current handler
      app.Context.Handler = new MyHttpHandler(app.Context.Handler);
   }
   void Application_PostAcquireRequestState(object source, EventArgs e)
   {
      HttpApplication app = (HttpApplication)source;
      MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;
      if (resourceHttpHandler != null) {
         // set the original handler back
         HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
      }
      // -> at this point session state should be available
      Debug.Assert(app.Session != null, "it did not work :(");
   }
   public void Dispose()
   {
   }
   // a temp handler used to force the SessionStateModule to load session state
   public class MyHttpHandler : IHttpHandler, IRequiresSessionState
   {
      internal readonly IHttpHandler OriginalHandler;
      public MyHttpHandler(IHttpHandler originalHandler)
      {
         OriginalHandler = originalHandler;
      }
      public void ProcessRequest(HttpContext context)
      {
         // do not worry, ProcessRequest() will not be called, but let's be safe
         throw new InvalidOperationException("MyHttpHandler cannot process requests.");
      }
      public bool IsReusable
      {
         // IsReusable must be set to false since class has a member!
         get { return false; }
      }
   }
}