Использование IHttpModule поверх Global.asax - PullRequest
4 голосов
/ 04 марта 2009

Мне поручили переписать нашу систему обработки исключений. Хотя я и утверждаю, что обработка исключений с точки зрения всего приложения - это не то, чего мы хотим, как правило, это неизбежно, когда наша команда недоукомплектована огромным количеством работы, которую мы должны вытолкнуть за дверь, поэтому, пожалуйста, не прикасайтесь к Глобализированное решение для обработки исключений здесь:)

Мне очень хотелось посмотреть, какие существуют общие решения. В настоящее время мы используем Global.asax с событием Application_Error для выполнения Server.GetLastError (), который помещается в состояние Session, затем вызывается перенаправление на другую страницу, где данные сеанса затем извлекаются и выводятся в удобочитаемом формате. Перенаправление также вызывает sproc, который тщательно проверяет информацию об ошибках, которая: а) отправляется по электронной почте разработчикам и б) просматривается с веб-страницы, доступной только для просмотра разработчиками.

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

РЕДАКТИРОВАТЬ: Код выше работает, кстати;)

РЕДАКТИРОВАТЬ: Кроме того, как HttpModule работает за кулисами? Он просто регистрирует событие Error для этой конкретной функции при запуске приложения?

UPDATE:

После долгих исследований кажется, что захват данных сеанса действительно, очень грязный, когда дело доходит до использования интерфейса IHttpModule. Я не думаю, что MS достаточно разработала HttpModule для его использования в нашем конкретном сценарии - пока не появятся события, специфичные для данных сеанса, мы не сможем использовать их слишком опасно.

Ответы [ 2 ]

6 голосов
/ 04 марта 2009

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

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

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

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

1 голос
/ 04 марта 2009

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

...