Вопрос

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

У меня была хорошая охота посмотреть, какие общие решения существуют.На данный момент мы используем Global.asax с событием Application_Error для выполнения Сервера.GetLastError(), который переводится в состояние сеанса, затем вызывается перенаправление на другую страницу, где затем извлекаются данные сеанса и выводятся в удобочитаемом формате.Перенаправление также вызывает 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

Мой вопрос в том, в чем преимущество этого решения по сравнению с использованием глобальных событий.asax?Кроме того, каков наилучший способ передать данные на страницу с ошибкой?

Редактировать: Кстати, приведенный выше код действительно работает ;)

Редактировать: Кроме того, как HttpModule работает за кулисами?Регистрирует ли он просто событие ошибки для этой конкретной функции при запуске приложения?

Обновить:

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top