2012-09-25 8 views
3

최근에 요청이 처리 된 다른 스레드에서 Application_Error 이벤트 처리기 (HttpApplication.Error)가 호출되는 문제가 발생했습니다.Application_Error가 다른 스레드에서 실행되었습니다.

것 우리는 최근에 변경된 :

  • 32 비트의 가치는 여기를 설명 할 수있는 몇 가지 코드가 무엇을 위해

  • 클래식 통합 파이프 라인 모드 비트 ~ 64 :
    하나의 대표적인 테스트에서 페이지에 표시된 스레드는 7이고 전자 메일의 스레드는 10입니다.

    //The application 
    public class MyApplication : HttpApplication 
    { 
        protected virtual void Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
        { 
         var threadId = System.Threading.Thread.Current.ManagedThreadId; 
         SendEmail("There was an error on threadId " + threadId.ToString()); 
        } 
    
        private void SendEmail(string message) 
        { 
         //snip 
        } 
    } 
    
    //Some aspx page 
    <% 
    var threadId = System.Threading.Thread.Current.ManagedThreadId; 
    throw new Exception("This is a test. ThreadId = " + threadID.ToString()); 
    %> 
    

    Thread.CurrentPrincipal에 인증 정보를 저장하는 중 문제가 발생하므로 예외와 함께 해당 정보를 기록해야합니다.

    어떻게 내가 같은 스레드에 유지하거나 IIS가 나에게 CurrentPrincipal을 원래 스레드에서 제공하게 할 수 있습니까?

  • +0

    이것은 오류가 throw되는 스레드 때문입니다. 던져지는 예외는 무엇입니까? – Justin

    +0

    @ Justin 나는 당신이 오해한다고 생각합니다. 이는 예외 일 수 있으며 예외가 throw 된 스레드는 Application_Error가 실행되는 스레드와 다릅니다. 이것은 응용 프로그램에서 처리되지 않은 예외를 기록하는 데 사용됩니다. – csauve

    +0

    흠 ... 정확히 threadID가 동일해야하는 이유는 무엇입니까? 실제 질문을 통해 질문을 명확히하는 것이 좋습니다. 지금까지는 "이 동작을 봅니다"라고 말하면서이 문제가 무엇인지 또는 실제 문제가 – Earlz

    답변

    2

    ASP.Net이 ASP.Net 페이지를 실행하고 오류를 처리하기 위해 다른 스레드를 사용하기 때문에이 동작이 나타나는 것으로 가정합니다.

    대신 HttpContext.Current.User을 사용하여 문제를 해결할 수 있어야합니다. 그러나 이들 사이에 미묘한 차이가있을 수 있습니다. 다른 개체를 가리킬 수 있다고 설명하는 this 문서를 확인할 수 있습니다. 그러나 기본적으로 그렇게 할 경우에만 수행합니다.

    +0

    에 대해 논평했다. 흥미 롭다. 나는 그것을 시도 할 것이다! – csauve

    +0

    아쉽게도 Request.Context.Current.User는 GenericPrincipal입니다. 우리가 찾고있는 주체는 IIS 인증 된 사용자가 아니라 우리 자신의 인증 메커니즘을 통해 Thread.CurrentPrincipal에 밀어 넣는 것입니다. – csauve

    +1

    그러면 큰 질문은 왜 요청 대신 스레드로 푸시됩니다. 제가 언급 한 블로그 게시물은 기본적으로 동기화되지 않은 상태가 나쁜 습관이라고 말합니다 – Earlz