내 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.Session
A의는 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");
}
}