В документации MSDN для элемента customErrors говорится, что он реализован с помощью System.Web.Configuration.CustomErrorsSection. Если для анализа этого класса мы используем .NET Reflector от Red Gate, мы увидим, где этот параметр используется в 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 вашей страницей defaultRedirect. (Это будет похоже на работу ScriptResource.axd.) Если вы предварительно скомпилируете свой модуль в DLL (в отличие от компиляции «на лету» из простого старого файла .axd), вы можете обнаружить, что он столь же надежен в лицо ошибочных условий. Если вы столкнулись с ошибкой, из-за которой даже это не сработало, статический файл .html, вероятно, тоже не сработал - имейте в виду, что директива customErrors по-прежнему опирается на .NET, работающую под капотом, и все еще использует StaticFileHandler для обслуживания ваш .html файл.
В качестве альтернативы вы могли бы рассмотреть обратный прокси-сервер перед вашим приложением IIS, который бы обслуживал удобные 500 страниц даже в случае катастрофического сбоя пула приложений. Это будет больше работы для настройки, но будет даже более надежным, чем customErrors, например если ваш web.config будет поврежден, даже customErrors не будет работать.