У меня есть настраиваемая страница ошибок для моего приложения:
<customErrors mode="On" defaultRedirect="~/errors/GeneralError.aspx"
/>
В Global.asax, Application_Error (), следующий код работает для получения сведений об исключении:
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.GetBaseException() != null)
ex = ex.GetBaseException();
}
К тому времени, когда я перехожу на страницу с ошибкой (~ / errors / GeneralError.aspx.cs), Server.GetLastError () имеет значение null
Есть ли способ получить подробную информацию об исключении на странице ошибок, а не в Global.asax.cs?
ASP.NET 3.5 в Vista / IIS7
Ответы:
Если присмотреться к моей настройке web.config, один из комментариев в этом посте очень полезен
Итак, мы можем внести поправки,
customErrors
добавив этот параметр:этот
ResponseRewrite
режим позволяет нам загружать «страницу ошибок» без перенаправления браузера, поэтому URL-адрес остается прежним, и, что важно для меня, информация об исключении не теряется.источник
UpdatePanel
s; страница с ошибкой больше не будет отображаться.Хорошо, я нашел этот пост: http://msdn.microsoft.com/en-us/library/aa479319.aspx
с этой очень наглядной схемой:
(источник: microsoft.com )
по сути, чтобы получить эти сведения об исключениях, мне нужно самому сохранить их в Global.asax для последующего извлечения на моей пользовательской странице ошибок.
кажется, лучший способ - сделать большую часть работы в Global.asax, при этом настраиваемые страницы ошибок обрабатывают полезный контент, а не логику.
источник
Комбинация того, что сказали NailItDown и Виктор. Предпочтительный / самый простой способ - использовать Global.Asax для хранения ошибки и затем перенаправить на свою страницу с пользовательской ошибкой.
Global.asax :
Кроме того, вам необходимо настроить свой web.config :
И, наконец, сделайте все, что вам нужно, за исключением того, что вы сохранили на странице ошибки :
источник
Application[]
это глобальный объект. Теоретически у вас может быть состояние гонки, когда вторая страница перезаписывает ошибку. Однако, посколькуSession[]
это не всегда доступно в условиях ошибки, я думаю, что это лучший выбор.Попробуйте использовать что - то вроде
Server.Transfer("~/ErrorPage.aspx");
внутриApplication_Error()
метода Global.asax.csЗатем из
Page_Load()
ErrorPage.aspx.cs вы можете сделать что-то вроде:Exception exception = Server.GetLastError().GetBaseException();
Server.Transfer()
кажется, что исключение остается в стороне.источник
Server.Transfer
после того, как страница была отрисована наполовину, то HTML-код страницы, на которую вы переходите, просто объединяется с тем, что уже было отрисовано. Таким образом, вы можете получить половину неработающей страницы, за которой следует страница с ошибкой под ней.Хотя здесь есть несколько хороших ответов, я должен указать, что не рекомендуется отображать сообщения об исключениях системы на страницах ошибок (что, как я предполагаю, вы хотите сделать). Вы можете непреднамеренно раскрыть злоумышленникам то, чего не хотите делать. Например, сообщения об исключениях сервера Sql очень подробны и могут содержать имя пользователя, пароль и информацию о схеме базы данных при возникновении ошибки. Эта информация не должна отображаться конечному пользователю.
источник
Вот мое решение ..
В Global.aspx:
В Oops.aspx:
источник
Одно важное соображение, которое, как мне кажется, здесь все упускают, - это сценарий балансировки нагрузки (веб-ферма). Поскольку сервер, на котором выполняется global.asax, может отличаться от сервера, на котором выполняется пользовательская страница ошибки, размещение объекта исключения в Application ненадежно.
Я все еще ищу надежное решение этой проблемы в конфигурации веб-фермы и / или хорошее объяснение от MS относительно того, почему вы просто не можете получить исключение с помощью Server.GetLastError на странице настраиваемой ошибки, как вы можете в global.asax Application_Error.
PS Небезопасно хранить данные в коллекции Application без предварительной блокировки, а затем разблокировки.
источник
Это связано с этими двумя темами ниже. Я хочу получить как GetHtmlErrorMessage, так и Session на странице ошибки.
Сессия равна нулю после ResponseRewrite
Почему HttpContext.Session имеет значение null, когда redirectMode = ResponseRewrite
Я попробовал и увидел решение, в котором нет необходимости
Server.Transfer() or Response.Redirect()
Во-первых: удалите ResponseRewrite в web.config
Web.config
Затем Global.asax
Тогда errorHandler.aspx.cs
Для справок
http://www.developer.com/net/asp/article.php/3299641/ServerTransfer-Vs-ResponseRedirect.htm
источник
У меня это сработало. в MVC 5
в
~\Global.asax
в
~\Controllers
CreateErrorController.cs
в
~\Models
CreateFunctionTools.cs
в
~\Views
Создать папкуError
и в~\Views\Error
СоздатьError.cshtml
Если вы введете этот адрес
localhost/Error
И если возникает ошибка
Как можно вместо отображения ошибок в базе данных хранить переменную log.
источник
Думаю, у вас есть несколько вариантов.
вы можете сохранить последнее исключение в сеансе и получить его со своей страницы ошибок; или вы можете просто перенаправить на свою страницу пользовательской ошибки в событии Application_error. Если вы выберете второй вариант, убедитесь, что используете метод Server.Transfer.
источник