我正在使用类似的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
:
但是,当customErrors mode="On"
时,只有http://localhost:52200/<
返回HTTP 400 Bad Request
,然后重定向到Error.aspx
。
现在,http://localhost:52200/<xyz
返回HTTP 500 Internal Server Error
并转到:
当我删除ResponseRewrite时,都返回HTTP 302 Found
并重定向到Error.aspx
。我不希望这样,因为我丢失了http错误代码。
我在做什么错了?
答案 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.config
和global.asax.cs
中的这两个块,并且没有更改IIS,http://localhost:52200/<
和http://localhost:52200/<a
现在都返回HTTP 400 Bad Request
并显示{{1} }。