Есть ли реализация где-то желтого экрана смерти?

В ASP.NET, когда вы находитесь в режиме DEBUG, и что-то не получается, вы получаете знаменитый желтый экран смерти.

Он показывает, что существует Server Error in <Location> Application, содержит описание, сведения об исключении, исходный файл и трассировку стека.

Я хотел бы расширить эту страницу ошибки, чтобы добавить дополнительную информацию.

  • Есть ли реализация с открытым исходным кодом желтого экрана смерти?
  • Есть ли способ расширить встроенный желтый экран смерти?

Ответы

Ответ 1

Форматирование страницы ошибки выполняется с помощью System.Web.ErrorFormatter и ее подклассов, которые, к сожалению, являются внутренними. Вы можете захватить HTML и изменить его, если хотите использовать HttpException.GetHtmlErrorMessage(). Но я был бы склонен делать то, что предлагали другие комментаторы, и использовать Server.GetLastError и отформатировать его сам.

Если это так, убедитесь, что вы HtmlEncode вышли сообщение об ошибке для уменьшения XSS и убедитесь, что на ваших производственных сайтах не отображается какая-либо информация об ошибке (так как это был вектор атаки для → →

Ответ 2

На этой странице есть информация, которую вы ищете.

http://www.asp.net/hosting/tutorials/processing-unhandled-exceptions-cs

По существу, когда исключение пузырится до времени выполнения, оно завершается в System.Web.HttpException (это было неправильно. По крайней мере, я не видел этого поведения в MVC 3).

Я бы подумал, что вы можете расширить этот класс и переопределить GetHtmlErrorMessage, чтобы вернуть все необходимые данные.

Обновление: Ну, с небольшим экспериментом, похоже, я ошибаюсь. НО есть обходной путь...

Вы можете написать информацию из исключения любым способом, а затем очистить ошибку, и вы получите то, что хотите вернуть.

Что-то вроде этого...

protected void Application_Error(object sender, EventArgs e)
{
    var context = HttpContext.Current;
    var error = context.Server.GetLastError();
    context.Response.Write(error.Message);
    context.Response.Write("<br /><br />");
    context.Response.Write(error.StackTrace);
    context.Response.Write("<br /><br />");
    context.Response.Write("Hello World");
    context.Server.ClearError();
}

Ответ 3

Если вы используете пользовательские страницы ошибок, я считаю, что вы можете получить последнюю ошибку с помощью HttpContext.Current.Server.GetLastError(); Я не уверен, есть ли какие-либо пользовательские страницы там. Но содержание YSOD должно быть доступно из контекста запроса.