3

最近我们开始看到一个问题,即 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?

4

1 回答 1

2

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

您应该能够通过使用来解决您的问题HttpContext.Current.User。但是,它们之间可能存在细微差别。您可以查看这篇文章,解释它们可以指向不同的对象(但基本上只有当你这样做时才会这样做)

于 2012-10-12T02:04:52.303 回答