[asp.net] HTTPModule에서 세션 상태에 액세스 할 수 있습니까?

내 HTTPModule 내에서 사용자의 세션 변수를 업데이트하여 실제로 할 수 있지만 볼 수있는 것은 불가능합니다.

업데이트 : 내 코드는 현재 OnBeginRequest ()이벤트 핸들러 내에서 실행 중 입니다.

업데이트 : 지금까지받은 조언에 따라 Init ()HTTPModule 의 루틴에 이것을 추가하려고했습니다 .

AddHandler context.PreRequestHandlerExecute, AddressOf OnPreRequestHandlerExecute

그러나 내 OnPreRequestHandlerExecute일상에서 세션 상태는 여전히 사용할 수 없습니다!

감사합니다. 내가 뭔가를 놓친다면 사과드립니다!



답변

ASP.NET 포럼 에서 이것을 찾았습니다 .

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,
// regardless 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; }
      }
   }
}


답변

HTTP 모듈이 세션 상태가 초기화되기 전에 발생 하는 파이프 라인 이벤트 를 처리하지 않는다고 가정하면 HttpContext.Current.Session 이 작동해야합니다 .

EDIT, 주석 설명 후 : BeginRequest 이벤트를 처리 할 때 Session 개체는 ASP.NET 런타임에 의해 아직 초기화되지 않았기 때문에 실제로 여전히 null / Nothing입니다. 이 문제를 해결하기 위해, 이후에 발생하는 이벤트에 처리 코드를 이동 PostAcquireRequestState 처럼 I를 – PreRequestHandlerExecute 모두 낮은 수준의 작업이 거의이 단계에서 수행되는 것처럼, 그 자신을 위해,하지만 당신은 여전히 어떤 정상적인 처리를 선점.


답변

액세스 HttpContext.Current.SessionA의는 IHttpModule수행 할 수 있습니다 PreRequestHandlerExecute핸들러입니다.

PreRequestHandlerExecute : “ASP.NET이 이벤트 처리기 (예 : 페이지 또는 XML 웹 서비스) 실행을 시작하기 직전에 발생합니다.” 이것은 ‘aspx’페이지가 제공되기 전에이 이벤트가 실행된다는 것을 의미합니다. ‘세션 상태’를 사용할 수 있으므로 자신을 녹일 수 있습니다.

예:

public class SessionModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += BeginTransaction;
            context.EndRequest += CommitAndCloseSession;
            context.PreRequestHandlerExecute += PreRequestHandlerExecute;
        }



        public void Dispose() { }

        public void PreRequestHandlerExecute(object sender, EventArgs e)
        {
            var context = ((HttpApplication)sender).Context;
            context.Session["some_sesion"] = new SomeObject();
        }
...
}


답변

페이지 또는 처리기를 통해 asp.net 요청에 적용하려는 관리되는 응용 프로그램에서 일반적인 기본 HttpModule을 작성하는 경우 세션 생성 후 수명주기에서 이벤트를 사용하고 있는지 확인하기 만하면됩니다. Begin_Request 대신 PreRequestHandlerExecute는 일반적으로 내가가는 곳입니다. mdb는 그의 편집에서 바로 그것을 가지고 있습니다.

원래 질문에 대한 답변으로 나열된 긴 코드 스 니펫이 작동하지만 초기 질문보다 복잡하고 광범위합니다. IRequiresSessionState 인터페이스를 구현할 수있는 ASP.net 처리기가없는 항목에서 콘텐츠가 들어오는 경우를 처리하여 세션 메커니즘을 트리거하여 사용할 수 있도록합니다. (디스크의 정적 gif 파일처럼). 기본적으로 세션을 사용할 수 있도록 인터페이스를 구현하는 더미 핸들러를 설정하는 것입니다.

코드에 대한 세션 만 원하면 모듈에서 처리 할 올바른 이벤트를 선택하기 만하면됩니다.


답변

시도해보십시오 : MyHttpModule 클래스에서 다음을 선언하십시오.

private HttpApplication contextapp;

그때:

public void Init(HttpApplication application)
{
     //Must be after AcquireRequestState - the session exist after RequestState
     application.PostAcquireRequestState += new EventHandler(MyNewEvent);
     this.contextapp=application;
}

따라서 동일한 클래스의 다른 메서드 (이벤트)에서 :

public void MyNewEvent(object sender, EventArgs e)
{
    //A example...
    if(contextoapp.Context.Session != null)
    {
       this.contextapp.Context.Session.Timeout=30;
       System.Diagnostics.Debug.WriteLine("Timeout changed");
    }
}


답변