HTTP 모듈에서 세션 상태에 액세스할 수 있습니까?
내 HTTP 모듈 내에서 사용자의 세션 변수를 업데이트하는 것으로 정말 할 수 있지만, 내가 보기에는 불가능합니다.
업데이트: 현재 내 코드가 내부에서 실행 중입니다.OnBeginRequest ()
이벤트 핸들러.
업데이트: 지금까지 받은 조언에 따라, 저는 이것을 추가하려고 했습니다.Init ()
내 HTTP 모듈의 루틴:
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; }
}
}
}
HttpContext입니다.현재.세션 상태가 초기화되기 전에 발생하는 파이프라인 이벤트를 HTTP 모듈에서 처리하지 않는 경우 세션이 작동해야 합니다.
EDIT, 설명 후 설명: BeginRequest 이벤트를 처리할 때 세션 개체는 아직 ASP.NET 런타임에 의해 초기화되지 않았기 때문에 null/Nothing이 됩니다.이 문제를 해결하려면 PostAquireRequestState 이후에 발생하는 이벤트로 처리 코드를 이동합니다. PreRequestHandler가 좋습니다.모든 낮은 수준의 작업은 이 단계에서 거의 완료되지만, 여전히 정상적인 처리를 먼저 수행하기 때문에 대해 직접 실행하십시오.
액세스HttpContext.Current.Session
순식간에IHttpModule
에서 할 수 있습니다.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 대신 Execute는 보통 내가 가는 곳입니다. mdb는 그의 편집에 그것을 가지고 있습니다.
원래 질문에 답하는 것으로 나열된 더 긴 코드 조각은 작동하지만, 초기 질문보다 복잡하고 광범위합니다.IRrequiresSessionState 인터페이스를 구현할 수 있는 ASP.net 핸들러가 없는 곳에서 콘텐츠가 전송되는 경우 이를 처리하여 세션 메커니즘을 트리거하여 사용 가능하게 합니다.(디스크의 정적 GIF 파일처럼).기본적으로 더미 핸들러를 설정하여 세션을 사용할 수 있도록 인터페이스를 구현합니다.
코드에 대한 세션을 원할 경우 모듈에서 처리할 올바른 이벤트를 선택하십시오.
.NET 4.0 이후로 IHTTPHandler를 사용하는 이 해커는 세션 상태를 로드할 필요가 없습니다(대부분의 업데이트된 답변에서 볼 수 있는 것과 같습니다).HttpContext 메서드가 있습니다.SessionStateBehavior를 설정하여 필요한 세션 동작을 정의합니다.모든 요청 집합에 세션이 필요한 경우runAllManagedModulesForAllRequests
HttpModule요청에 하는 데 하므로 web.config HttpModule을 true로 .preCondition="managedHandler"
모든 요청에 대해 세션이 필요하지 않은 경우.다음은 미래의 독자를 위한 완전한 예입니다.
web.config 선언 - 모든 요청에 대해 HttpModule 호출:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="ModuleWithSessionAccess" type="HttpModuleWithSessionAccess.ModuleWithSessionAccess, HttpModuleWithSessionAccess"/>
</modules>
</system.webServer>
web.config 선언 - 관리되는 요청에 대해서만 HttpModule을 호출합니다.
<system.webServer>
<modules>
<add name="ModuleWithSessionAccess" type="HttpModuleWithSessionAccess.ModuleWithSessionAccess, HttpModuleWithSessionAccess" preCondition="managedHandler"/>
</modules>
</system.webServer>
IHTTP 모듈 구현:
namespace HttpModuleWithSessionAccess
{
public class ModuleWithSessionAccess : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest;
context.PreRequestHandlerExecute += Context_PreRequestHandlerExecute;
}
private void Context_BeginRequest(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
app.Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
private void Context_PreRequestHandlerExecute(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
if (app.Context.Session != null)
{
app.Context.Session["Random"] = $"Random value: {new Random().Next()}";
}
}
public void Dispose()
{
}
}
}
사용해 보십시오. 클래스에서 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");
}
}
언급URL : https://stackoverflow.com/questions/276355/can-i-access-session-state-from-an-httpmodule
'IT' 카테고리의 다른 글
SQL의 기존 테이블에 null이 아닌 새 열이 있는 대체 테이블 (0) | 2023.07.12 |
---|---|
SQL Plus 현재 디렉터리 변경 (0) | 2023.07.07 |
그룹별 변수 합계 방법 (0) | 2023.07.07 |
Mongodb 서비스가 시작되지 않습니다. (0) | 2023.07.07 |
빈 문자열이 split() 결과로 반환되는 이유는 무엇입니까? (0) | 2023.07.07 |