В настоящее время мы обрабатываем ошибки через Application_Error
в global.asax.vb
:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
OurLibrary.HandleError(Me)
End Sub
HandleError
затем регистрирует ошибку в базе данных, отображает информационное сообщение для пользователя и возвращает правильный код состояния (404 или 500) в зависимости от типа возникшего исключения:
Public Shared Sub HandleError(httpApp As HttpApplication)
''# do some logging
...
''# show some details about the error and information about how to contact us
httpApp.Response.Write(...)
httpApp.Response.StatusCode = 404 or 500
httpApp.Server.ClearError()
End Sub
Server.ClearError
необходимо, поскольку в противном случае запускается обработка ошибок ASP.NET по умолчанию, и отображается пользователь - в зависимости от текущего состояния <customErrors>
- либо «желтый экран смерти», либо информационное сообщение. о том, как <customErrors>
можно отключить.
Недостаток использования ClearError
заключается в том, что я больше не могу использовать <customErrors>
для переопределения поведения обработки ошибок - что вызвало немало проблем во время недавней ASP.NET-уязвимости , где рекомендуемый обходной путь был сделан, используя <customErrors>
.
Я знаю, что мог бы использовать только customErrors
и показывать информацию для пользователя на странице, на которую ссылается атрибут defaultRedirect
, но для этого нужно было бы добавить эту страницу ошибки к каждой веб-проект (вместо того, чтобы все хорошо централизовать в одной библиотечной функции).
Возможно ли сделать обычную обработку ошибок в Application_Error, но все же разрешить ее переопределить на <customErrors>
? Это даже лучшая практика или я делаю что-то в корне неправильно?
PS: Многие из наших приложений размещены на серверах наших клиентов (а не на наших собственных), поэтому «помещать всю информацию в журнал приложений и ничего не показывать пользователю» на самом деле не вариант.
Решение : заменить httpApp.Server.ClearError()
на
If Not HttpContext.Current.IsCustomErrorEnabled Then httpApp.Server.ClearError()