2012-12-25 2 views
0

나는 PostAuthenticateRequest이 방법을 첨부 HttpModule을의 개인 재산을 선언ASP.Net httpmodule 정적 속성으로 작동하는 개인 속성?

roles.Add(AppSettings.AnonymousRoleId) 

하지만 그런 다음 모듈의 다양한 방법에 나는이 방법을 목록에 역할을 추가

Private Property roles as New List(Of Integer) 

이상한 행동을 경험하고 있습니다 ... 페이지를 새로 고칠 때마다 개인 목록 역할이 각 페이지 새로 고침에서 기억되는 것처럼 역할 목록이 항상 길어집니다. 응용 프로그램 정적 변수와 동일합니다. 이 속성을 모듈에 대해 비공개로 설정하면 안됩니까?

답변

0

PostAuthenticateRequest 이벤트는 페이지 당 여러 번 호출 될 수 있습니다.

내가 모듈이있는 경우 모듈의 처리를 건너 뛸 플래그를 구현하는 tryed .... 나는이에 대한 몇 가지 다른 테스트를했고, 나는 아주 이상한 문제가 발생하고있어 PostAuthenticateRequest fires several times

+0

아야! 그 아파요 ... 나는 DB를 가지고 아무것도하지 않고 있지만 쿠키를 읽고 사용자 지정 IPrincipal을 만듭니다 (역할, taks, 경로가있는 다중 애플리케이션). 그래서 플래그를 설정하는 것이 좋습니다. 문맥.항목을 처음부터 전체 프로세스를 건너 뛸 수 있습니다! 이렇게 나는 모든 httpmodules에서 일어난다 고 생각한다. 이미지, css, js 등과 같은 정적 파일조차도 각 요청에 대해 트리거된다. static.mysite.com과 같은 다른 도메인에 올려 놓았습니까? 이상한 방법으로는 정적 콘텐츠를 실행하는 httpmodules를 제외 할 수 없습니다. – Manight

0

좋아 여기 봐 적어도 한 번 읽었다.

 Private Sub Application_PostAuthenticateRequest(ByVal source As Object, ByVal e As EventArgs) 
     ' A flag to prevent multiple execution on each request for static files like images, css, js 
     If HttpContext.Current.Items("UserCheck") Is Nothing AndAlso _ 
     DirectCast(HttpContext.Current.Items("UserCheck"), String) <> "1" Then 
      GlobalAppSettings.debug += 1 

GlobalAppSettings.Debug 내가 HttpModules는의 purprose를 디버깅하기 위해 사용하는 정적 (VB 공유) 속성입니다 :이 단순히 HttpContext.Current.Items 이런 식으로 플래그 VAR을 넣어했다. 이제이 코드를 사용하여 각 페이지를 새로 고칠 때 디버그 변수를 +1해야합니다 (간단한 Response.Write (GlobalAppSettings.debug)로 Default.aspx의 코드에서 확인) 이것은 내가 설정 한 Application_PostAuthenticateRequest 방법 HttpContext.Current.Items ("UserCheck") = "1"

는 왜 각 페이지에 3? 5 단계로 GlobalAppSettings.debug에게 변수 단위로 새로 고침 화가 날 운전되어

0

좋아, 내가 모든 것들에 대한 답변을 찾은 것 같아요. jpg, css, js에 대한 각 요청은 자신의 HttpContext를 실행하기 때문에 HttpContext.Current.Items ("UserCheck")에 대한 검사가 작동하지 않습니다. 그런 식으로 글로벌 플래그.

검색을 약간 수행 한 후에 훨씬 깨끗하고 일반적인 솔루션을 발견했습니다.

<modules runAllManagedModulesForAllRequests="false"> 

은 또한 당신이 추가 할 수 있습니다 당신이 당신의 모듈을 원하지 않는 경우가 stati 컨텐트 요청에 발사 할 당신이 섹션의 웹 설정에서 설정해야합니다 (느릅 나무는 페이지의 정적 리소스 포함) 귀하의 모듈 속성 : precondition = "managedHandler". 예 :

<add name="ReadUserSettings" type="namespace.to.type" preCondition="managedHandler" /> 

내 web.config에는 이러한 설정이 없습니다. 이제 또 다른 작은 문제에 봉착하게되었지만 이제는 무슨 일이 일어나고 있는지 더 잘 이해할 수있게되었습니다. 주제에 대해보다 구체적인 주제를 열어야합니다. 즉, .axd 처리기를 제외하는 방법입니다 (또는 WebResources.axd 핸들러는 커스텀 모듈을 실행하지 못하게한다. 왜냐하면 .axd 핸들러는 threated가 preCondition = "integratedMode, runtimeVersionv4.0"을 가지고 있기 때문에 코드를 관리하기 때문이다. 나는 그 모듈이나 다른 .axd 모듈을 해고하는 것을 원치 않는다.