2011-11-23 2 views
1

HttpHandler를 통해 모든 요청을 라우팅하는 유료 제품을 사용자 정의하려고합니다. 핸들러는 요청을 분석하여 사용자에게 라우팅 할 페이지를 파악하고 Server.Transfer()를 수행합니다. 불행히도, 페이지에서 SessionState에 액세스해야하며 처리기가 IRequiresSessionState를 구현하지 않고 내부로 표시되어 있으므로 상속받을 수 없습니다. 많은 검색 결과를 얻은 후에 가장 좋은 해결책은 요청주기의 여러 지점에서 요청을 처리하는 처리기를 변경하는 HttpModule을 만드는 것입니다. PostMapRequestHandler에서 요청을 처리하는 핸들러를 IRequiresSessionState 및 PostAcquireRequestState를 구현하는 자체 시스템으로 변경합니다. 다시 매핑 할 것입니다.HttpHandler가 SessionState를 사용하도록합니다.

이 방법이 효과적이지만 누구에게 더 좋은 해결책이 있습니까?

+0

링크 된'HttpModule' 코드는 나에게 꽤 좋아 보인다. – LukeH

답변

0

또 다른 해결책은 세션 상태가 필요한 처리기를 통해 모든 요청을 라우팅 한 다음 해당 요청을 내부 처리기 ProcessRequest 메서드를 호출하여 전달하는 것입니다. say를 사용하여 내부 처리기의 인스턴스를 만들 수 있습니다 (또는 처리기 팩토리 만약에 어떠한).

그러나 HttpModule을 사용하여 핸들러를 교체하는 것이 확실히 좋은 해결책입니다. 요청 된 URL을보고 핸들러를 선택적으로 교체하도록 선택할 수 있기 때문입니다. 이렇게하면 모든 요청에 ​​대해 세션 상태를로드/저장할 필요가 없어 질 수 있습니다 (비 프로세스 세션에서는 값 비싼 작업이 될 수 있습니다).

1

세션 상태를 사용하는 좀 더 우아한 방법을 찾아 냈습니다. 핸들러의 세션 상태 동작을 재정의 할 수 있습니다. 세션 상태를 강제로 만드는 모듈을 만들었습니다.

public class SessionEnablerModule : IHttpModule 
{ 
    public void Dispose() 
    { 

    } 

    public void Init(HttpApplication context) 
    { 
     context.PostMapRequestHandler += new EventHandler(context_PostMapRequestHandler); 
    } 

    void context_PostMapRequestHandler(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 

     if ((app.Context.Handler.GetType().ToString().Equals("Handler I want to enable session state for"))) 
     { 
      //enable session state 
      app.Context.SetSessionStateBehavior(SessionStateBehavior.Required); 
     } 
    } 
} 
관련 문제