最近,我们开始发现一个问题,即在处理请求的不同线程上调用Application_Error事件处理程序(用于HttpApplication.Error)。
我们最近改变的事情:
对于它的价值,这里有一些代码可能有助于解释这一点:
在一个代表性的测试中,页面上显示的线程是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 :(得分:2)
我假设你看到了这种行为,因为ASP.Net使用不同的线程来执行ASP.Net页面并处理错误。
您应该可以使用HttpContext.Current.User
来解决问题。但是,这些之间可能存在细微差别。您可以查看this文章,说明它们可以指向不同的对象(但基本上只有这样做才能实现)