Ошибка 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
вместо. Однако между ними могут быть тонкие различия. Вы можете проверить эту статью, в которой объясняется, что они могут указывать на разные объекты (но в основном это можно сделать, только если вы сделаете это таким образом)