Ошибка Application_Error в другом потоке

Недавно мы столкнулись с проблемой, когда обработчик события 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 ответ

Решение

Я предполагаю, что вы наблюдаете такое поведение, потому что ASP.Net использует разные потоки для выполнения страницы ASP.Net и обработки ошибки.

Вы должны быть в состоянии решить вашу проблему с помощью HttpContext.Current.User вместо. Однако между ними могут быть тонкие различия. Вы можете проверить эту статью, в которой объясняется, что они могут указывать на разные объекты (но в основном это можно сделать, только если вы сделаете это таким образом)

Другие вопросы по тегам