2013-07-10 3 views
0

모두 요청을 캐치하고 새 페이지로 리디렉션하기 위해 HttpModule (IHttpModule)을 구현하려고합니다. 죄송 합니다만 새 페이지에서 Session을 사용할 수없는 것 같습니다. Session이 null이기 때문에HttpModule에서 요청을 전송할 때 새 페이지에서 세션이 null입니다.

내 코드는 다음과 같습니다. 검토해주십시오. HttpContext.Current.Session가 null이기 때문에 newpage.aspx에서

public class MyModule : IHttpModule 
{ 
     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += new EventHandler(context_BeginRequest); 

     } 

     void context_BeginRequest(object sender, EventArgs e) 
     { 
      .... 
      HttpContext.Current.Server.Transfer("newpage.aspx");//redirect to new page. 
     } 
} 

는 예외 코드 HttpContext.Current.Session[xxx]에 대한 Object reference not set to an instance of an object 말한다 있습니다. 누군가 어떤 일이 일어 났는지 말해 줄 수 있습니까? 감사합니다. . 내가 URL을 리디렉션 할 HttpContext.Current.Response.Redirect를 사용하는 경우

모든

업데이트, 나는 발견했다. 모든 것은 괜찮습니다. 제 말은 Session 개체가 사용되기 전에 시작된다는 것입니다.하지만 Server.Transfer에는 작동하지 않습니다.

나는 이미 이들의 차이점을 알고 있습니다. two.

+0

첫 번째 및 두 번째 페이지의 URL을 표시 할 수 있습니까? 아마 다른 프로토콜에 대한 별도의 도메인으로 갈 수 있습니다. – Peter

+0

@peer 두 앱 모두 같은 앱에 있습니다. url은'http : // localhost : 7778/orginalpage.aspx'에서'http : // localhost : 7778/b/c/newpage.aspx'로 리디렉션됩니다. 감사. –

답변

0

이 모듈과의 정상 영문 런타임 파이프 라인은 다음과 같습니다

--> HttpModule_1.BeginRequest(); --> HttpModule_2.BeginRequest(); --> HttpHandler(Page) 
<-- HttpModule_1.EndRequest(); <-- HttpModule_2.EndRequest(); <-- HttpHandler(Page) 

는 영문 세션 모듈로 HttpModule_2을 사용자 정의 모듈로 HttpModule_1을 상상합니다.

사용자 정의 모듈이 먼저 실행 중이므로 모듈이 실행 중일 때 세션이 채워지지 않습니다.

HttpModule_1이 BeginRequest를 실행 중일 때 Server.Trasfer()를 추가합니다. 이제 서버 전송은 요청 페이지의 HttpHandler를 즉시 실행하고 BeginRequest를 벗어나지 않고 호출되며 처리기가 완료되면 전송 메소드는 Request.End()를 실행하고 처리를 종료합니다.

따라서 "newpage.aspx"의 처리기도 세션 모듈보다 먼저 실행됩니다. 실제로 Server.Transfer()가 요청을 끝내기 때문에 세션 모듈이 실행되지 않습니다.

모듈 앞에서 세션 모듈이 프로세스임을 보장한다면 문제를 해결해야합니다 (https://stackoverflow.com/a/2427632/953144 참조).