HTTP ошибки не согласованы при использовании customErrors mode = "On" - PullRequest
0 голосов
/ 20 декабря 2018

Я тестирую пользовательскую обработку ошибок, используя похожие URL http://localhost:52200/< и http://localhost:52200/<xyz.Почему-то я получаю противоречивые результаты.

Web.Config:

<!--MVC pipeline-->
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx">
    <error statusCode="404" redirect="~/404.aspx" />
    <error statusCode="500" redirect="~/500.aspx" />
</customErrors>

<!--IIS pipeline-->
<httpErrors errorMode="Custom">
  <remove statusCode="404"/>
  <error statusCode="404" path="404.html" responseMode="File"/>
  <remove statusCode="500"/>
  <error statusCode="500" path="500.html" responseMode="File"/>
</httpErrors>

Когда customErrors mode="Off", оба возвращают идентичные HTTP 400 Bad Request:

enter image description here

Однако, когда customErrors mode="On", только http://localhost:52200/< возвращает HTTP 400 Bad Request, а затем перенаправляет на Error.aspx.

Сейчас, http://localhost:52200/<xyzвозвращает HTTP 500 Internal Server Error и переходит к:

enter image description here

Когда я удаляю ResponseRewrite , оба возвращают HTTP 302 Found и перенаправляют на Error.aspx.Я не хочу этого, потому что я теряю код ошибки http.

Что я делаю не так?

1 Ответ

0 голосов
/ 20 декабря 2018

Решено!По неизвестной мне причине конвейер MVC требует defaultRedirect для указания на файл .html:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error.html">

Добавление Response.ContentType = "text/html"; в Global.asax.cs позволяет избежать известной проблемы, когда страница ошибки отображается кактекст:

protected void Application_Error()
{
    var exception = Server.GetLastError();
    if (exception is HttpException httpException)
    {
        Response.ContentType = "text/html";
        Response.StatusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;
    }
}

Кроме того, Response.StatusCode гарантирует, что правильный код ошибки HTTP достигнет клиента (например, 400, 503 и т. д.) вместо 200.

С этими 2 блокамив web.config и global.asax.cs и без изменений в IIS, http://localhost:52200/< и http://localhost:52200/<a теперь возвращают HTTP 400 Bad Request и отображают Error.html, как и ожидалось.

...