Мы сконфигурировали наши настраиваемые страницы ошибок, как показано ниже, для исключений, созданных ASP.NET:
<customErrors mode="On" redirectMode="ResponseRewrite">
<error statusCode="400" redirect="~/400.aspx"/>
<error statusCode="404" redirect="~/404.aspx"/>
<error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
Настройка redirectMode="ResponseRewrite"
важна, поскольку она гарантирует, что URL-адрес не изменится (я считаю, что ASP.NET выполняет Server.Transfer
вместо Response.Redirect
).
К сожалению, это не работает для ошибок проверки запроса. Например, если пользовательские ошибки включены, если я перехожу к /some/page/<script>
, выполняется проверка запроса ASP.NET, и создается HttpException
. Однако вместо отображения моей пользовательской страницы ошибки я получаю следующее сообщение:
Ошибка сервера в приложении "/".
Ошибка выполнения
Описание: При обработке вашего запроса произошло исключение. Кроме того, при выполнении пользовательских Страница ошибки для первого исключения. Запрос завершен.
Почему ASP.NET не может отобразить мою страницу ошибок в этом сценарии? На странице с ошибкой отсутствует код, поэтому я знаю, что сама страница ошибки не выбрасывает никаких исключений.
Кроме того, если я сам поймаю ошибку в Application_Error
и выпущу Server.Transfer
, она отлично работает, поэтому мне любопытно, что делает ASP.NET под обложками.
Если мы должны справиться с этим самим, есть ли лучшее решение, чем это?
protected void Application_Error(object sender, EventArgs e)
{
var ex = Server.GetLastError() as HttpException;
if (ex != null
&& ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client")
&& HttpContext.Current.IsCustomErrorEnabled)
{
Server.Transfer("400.aspx");
}
}