2009-03-04 5 views
4

Мне очень понравилась переписывать нашу систему обработки исключений. Пока я заявляю, что обработка исключений с точки зрения приложения не является чем-то, что мы хотим, обычно это неизбежно, когда наша команда недоукомплектована тем, что нам нужно выталкивать дверь, поэтому, пожалуйста, не пылайте глобализованное решение для обработки исключений здесь :)Использование 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 достаточно, чтобы он использовался в нашем конкретном сценарии - пока не будут события, специфичные для данных сеанса, которые нам слишком опасны для использования.

+0

Я задал соответствующий вопрос несколько дней назад. См. [Http://stackoverflow.com/questions/583307/asp-net-error-handling](http://stackoverflow.com/questions/583307/asp-net-error-handling) – NYSystemsAnalyst

ответ

6

Использование модуля имеет то преимущество, что оно легко снимается, все, что вам нужно сделать, чтобы отключить его, - удалить его с < httpModules> в вашей конфигурации.

Что касается ваших данных, попробуйте перейти с Server.Transfer или Server.RewritePath - это позволит сохранить все текущие данные (включая последнюю ошибку сервера).

Если по какой-либо причине он очищает последнюю ошибку, вы можете сохранить ошибку до HttpContext.Items перед передачей/переписыванием, а затем получить ее позже.

Редактировать: В ответ на ваше изменение IHttpModule присоединяется к любым соответствующим событиям в его реализации IHttpModule.Init.

+0

Может ли HttpModule использоваться в место Global.asax? Или Global.asax должен всегда существовать, даже если он ничего не делает? – Kezzer

+0

Global.asax не требуется.Если вы не используете его, будет использоваться класс по умолчанию HttpApplication (вместо вашего унаследованного класса в Global.asax). –

+0

Я не могу найти ничего, что коррелирует с Session_Start в HttpModule, хотя это не поддерживается? – Kezzer

1

HttpModule в основном делает то же самое, что и Global.asax. Он разработан как более многоразовый и автономный модуль для обработки событий.

Смежные вопросы