3

最近、Application_Errorイベントハンドラー(HttpApplication.Errorの場合)が、要求が処理された場所とは異なるスレッドで呼び出されるという問題が発生し始めました。

最近変更したもの:

  • 32ビットから64ビット
  • クラシックから統合パイプラインモード

その価値について、これを説明するのに役立つ可能性のあるコードを
次に示します。1つの代表的なテストでは、ページに表示されるスレッドは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を提供させるにはどうすればよいですか?

4

1 に答える 1

2

ASP.NetはASP.Netページの実行とエラーの処理に異なるスレッドを使用するため、この動作が見られると思います。

HttpContext.Current.User代わりにを使用して問題を解決できるはずです。ただし、これらの間には微妙な違いがある場合があります。さまざまなオブジェクトを指すことができることを説明しているこの記事を確認できます(ただし、基本的には、そのようにした場合にのみ行います)

于 2012-10-12T02:04:52.303 に答える