使用 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.config
和 global.asax.cs
中的这两个块并且 IIS 没有变化,http://localhost:52200/<
和 http://localhost:52200/<a
现在 return HTTP 400 Bad Request
并按预期显示 Error.html
。
我正在使用类似的 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.config
和 global.asax.cs
中的这两个块并且 IIS 没有变化,http://localhost:52200/<
和 http://localhost:52200/<a
现在 return HTTP 400 Bad Request
并按预期显示 Error.html
。