使用customErrors mode =“ On”时HTTP错误不一致

时间:2018-12-19 22:06:03

标签: asp.net-mvc iis http-error custom-errors

我正在使用类似的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 :(得分:0)

解决了!由于我不知道的原因,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错误代码(而不是200)到达客户端(例如400、503等)。

有了web.configglobal.asax.cs中的这两个块,并且没有更改IIS,http://localhost:52200/<http://localhost:52200/<a现在都返回HTTP 400 Bad Request并显示{{1} }。