使用 customErrors mode="On" 的 HTTP 错误不一致

HTTP errors not consistent using customErrors mode="On"

我正在使用类似的 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"时,两者return相同HTTP 400 Bad Request:

但是,当customErrors mode="On"时,只有http://localhost:52200/< returns HTTP 400 Bad Request然后重定向到Error.aspx.

现在,http://localhost:52200/<xyz returns HTTP 500 Internal Server Error 并前往:

当我删除 ResponseRewrite 时,return HTTP 302 Found 和重定向到 Error.aspx。我不想要这个,因为我丢失了 http 错误代码。

我做错了什么?

已解决!出于我不知道的原因,MVC 管道需要 defaultRedirect 指向 .html 文件:

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

Global.asax.cs 中添加 Response.ContentType = "text/html"; 避免了错误页面呈现为文本的已知问题:

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。

有了 web.configglobal.asax.cs 中的这两个块并且 IIS 没有变化,http://localhost:52200/<http://localhost:52200/<a 现在 return HTTP 400 Bad Request并按预期显示 Error.html