Мне очень понравилась переписывать нашу систему обработки исключений. Пока я заявляю, что обработка исключений с точки зрения приложения не является чем-то, что мы хотим, обычно это неизбежно, когда наша команда недоукомплектована тем, что нам нужно выталкивать дверь, поэтому, пожалуйста, не пылайте глобализованное решение для обработки исключений здесь :)Использование IHttpModule Over Global.asax
У меня была хорошая охота, чтобы увидеть, какие общие решения существуют. В настоящий момент мы используем Global.asax с событием Application_Error для выполнения Server.GetLastError(), который помещается в состояние сеанса, а затем перенаправляется на другую страницу, где данные сеанса затем извлекаются и выводятся в человекообразном формате. Переадресация также вызывает sproc, который будет тщательно проверять информацию об ошибке, которая: a) отправляется электронной почте разработчикам и b) просматривается с веб-страницы, которую могут просматривать только разработчики.
Новый способ я видел делать вещи, используя интерфейс IHttpModule, используя класс в App_Code, чтобы сделать что-то вдоль этих линий (это мое быстрое внедрение)
Imports Microsoft.VisualBasic
Public Class ErrorModule : Implements IHttpModule
Public Sub Dispose() Implements System.Web.IHttpModule.Dispose
' Not used
End Sub
Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init
AddHandler context.Error, AddressOf context_Error
End Sub
Public Sub context_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim ex As Exception = HttpContext.Current.Server.GetLastError
' do something with the error
' call the stored procedure
' redirect the user to the error page
HttpContext.Current.Server.ClearError()
HttpContext.Current.Response.Redirect("index.htm")
End Sub
End Class
Мой вопрос, что преимущество этого решения над использованием событий Global.asax? Кроме того, каков наилучший способ передачи данных на страницу с ошибкой?
EDIT: Код выше работает, кстати;)
EDIT: Кроме того, как делает HttpModule работа за кулисами? Он просто регистрирует событие Error для этой конкретной функции при запуске приложения?
UPDATE:
После долгих дальнейших исследований кажется, захватывая данные сеанса действительно, очень грязный, когда речь заходит об использовании интерфейса IHttpModule. Я не думаю, что MS созрел HttpModule достаточно, чтобы он использовался в нашем конкретном сценарии - пока не будут события, специфичные для данных сеанса, которые нам слишком опасны для использования.
Я задал соответствующий вопрос несколько дней назад. См. [Http://stackoverflow.com/questions/583307/asp-net-error-handling](http://stackoverflow.com/questions/583307/asp-net-error-handling) – NYSystemsAnalyst