Asp.net 在不同线程上触发应用程序错误

Asp.net 在不同线程上触发应用程序错误,asp.net,exception,iis,httpapplication,Asp.net,Exception,Iis,Httpapplication,最近,我们开始看到一个问题,应用程序错误事件处理程序(for)在处理请求的不同线程上被调用 我们最近发生了变化: 32位到64位 经典到集成管道模式 下面是一些可能有助于解释这一点的代码: 在一个代表性测试中,页面上显示的线程是7,而电子邮件中的线程是10 //The application public class MyApplication : HttpApplication { protected virtual void Application_Error(ByVal sen

最近,我们开始看到一个问题,应用程序错误事件处理程序(for)在处理请求的不同线程上被调用

我们最近发生了变化:

  • 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());
%>
//应用程序
公共类MyApplication:HttpApplication
{
受保护的虚拟无效应用程序\u错误(ByVal发送方作为对象,ByVal e作为事件参数)
{
var threadId=System.Threading.Thread.Current.ManagedThreadId;
SendEmail(“threadId”+threadId.ToString()上出现错误);
}
私人void sendmail(字符串消息)
{ 
//剪断
}
}
//一些aspx页面
当我们在中存储身份验证信息时,这会给我们带来问题,我们需要将该信息记录到异常中


如何将其保持在同一个线程上,或者让IIS从原始线程中为我提供CurrentPrincipal?

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


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

这是因为这是引发错误的线程。抛出的异常是什么?@Justin我想你误解了。这可以是任何异常,引发异常的线程与引发应用程序错误的线程不同。这用于记录应用程序中任何未处理的异常。嗯。。。为什么您需要相同的threadID?我还建议通过提出一个实际问题来澄清你的问题。到目前为止,您所做的只是说“我看到了这种行为”,而不告诉我们为什么这很重要,或者在我的问题中您的实际问题是什么:“我们正在Thread.CurrentPrincipal中存储身份验证信息”我们需要CurrentPrincipal用于日志记录。它以前就在那里,但我把它移到了底部,以引起人们对它的注意。是的,我误读了它,并略过了我第一次评论的那部分。我要试试看!不幸的是,Request.Context.Current.User只是一个GenericPrincipal。请注意,我们正在寻找的主体是通过我们自己的身份验证机制推入Thread.CurrentPrincipal的主体,而不是经过IIS身份验证的用户。那么,最大的问题是为什么要推入Thread而不是Request。。我提到的博客文章基本上说,让这些不同步是一种糟糕的做法