最近、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を提供させるにはどうすればよいですか?