Application_Error在不同的线程上触发

时间:2012-09-25 14:52:58

标签: asp.net exception iis httpapplication

最近,我们开始发现一个问题,即在处理请求的不同线程上调用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?

1 个答案:

答案 0 :(得分:2)

我假设你看到了这种行为,因为ASP.Net使用不同的线程来执行ASP.Net页面并处理错误。

您应该可以使用HttpContext.Current.User来解决问题。但是,这些之间可能存在细微差别。您可以查看this文章,说明它们可以指向不同的对象(但基本上只有这样做才能实现)