Есть ли реализация где-то желтого экрана смерти?
В 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 должно быть доступно из контекста запроса.
Ответ 4
Да, есть.
Смотрите здесь:
http://www.oschina.net/code/explore/mono-2.8.1/mcs/class/System.Web/System.Web/HttpException.cs
Это из исходного кода mono (.NET для Linux), в версиях < 2.10 (т.е. 2.8).
В версии 2.10+ они начали использовать шаблоны, что затрудняет их поиск и понимание.