最近我们开始看到一个问题,即 Application_Error 事件处理程序(对于HttpApplication.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?