В документации MSDN для элемента customErrors указано, что он реализован System.Web.Configuration.CustomErrorsSection. Если мы используем Red Gate .NET Reflector для анализа этого класса, мы можем увидеть, где этот параметр используется в Framework.
Он используется System.Web.UI.Page.HandleError и System.Web.HttpResponse.ReportRuntimeError.
Оба они заканчиваются вызовом System.Web.HttpResponse.RedirectToErrorPage. (Название этого метода сбивает с толку: важно отметить, что RedirectToErrorPage принимает параметр redirectMode в качестве параметра, поэтому он вызывается, даже если вы используете ResponseRewrite и на самом деле перенаправление не происходит.)
Соответствующая часть метода RedirectToErrorPage:
if (redirectMode == CustomErrorsRedirectMode.ResponseRewrite)
{
this.Context.Server.Execute(url);
}
Кажется, нет никакого способа установить код ответа при обработке ошибок: в конце концов, это просто Server.Execute. Поэтому кажется неизбежным, что вам нужно будет написать код для получения желаемого HTTP-ответа.
Можете ли вы пересмотреть, почему вы хотите использовать простой файл .html? Это кажется разумным выбором для обработки ошибок, потому что вы не хотите проходить через все накладные расходы страницы .aspx, когда это может привести к возникновению другой ошибки.
Но, возможно, есть какая-то золотая середина, которая будет столь же надежной, как файл .html?
Например, вы можете создать предварительно скомпилированный HttpHandler, зарегистрировать его по URL-адресу /500.error, а затем сделать 500.error страницей перенаправления по умолчанию. (Это будет похоже на то, как работает ScriptResource.axd.) Если вы предварительно скомпилируете свой модуль в DLL (в отличие от компиляции на лету из простого старого файла .axd), вы можете обнаружить, что он так же надежен в состояние ошибки. Если вы столкнулись с ошибкой, при которой даже это не сработает, то статический файл .html, вероятно, тоже не сработает — имейте в виду, что директива customErrors по-прежнему полагается на .NET, работающий под капотом, и по-прежнему использует StaticFileHandler для обслуживания ваш .html файл.
В качестве альтернативы вы можете рассмотреть обратный прокси-сервер перед вашим приложением IIS, который будет обслуживать дружественные 500 страниц даже в случае катастрофического сбоя пула приложений. Это потребовало бы больше работы для настройки, но было бы даже более надежным, чем customErrors, например. если ваш web.config будет поврежден, даже customErrors не будут работать.
person
David James
schedule
27.08.2010