EDIT:
答案是not显而易见,但这似乎可以解释它:http://www.asp.net/web-forms/tutorials/deployment/deploying-web-site-projects/displaying-a-custom-error-page-cs
如果你向下滚动,你会发现这个可爱的花絮:
注意:自定义错误页面仅在发出请求时显示
到由 ASP.NET 引擎处理的资源。正如我们在
IIS 和 ASP.NET 开发服务器之间的核心区别
教程中,Web 服务器可能会自行处理某些请求。经过
默认情况下,IIS Web 服务器处理静态内容的请求,例如
图像和 HTML 文件,无需调用 ASP.NET 引擎。
因此,如果用户请求一个不存在的图像文件,他们将
取回 IIS 的默认 404 错误消息而不是 ASP.NET 的
配置错误页面。
我已经强调了第一行。我在默认模板中对此进行了测试,果然,这个 URL:
http://localhost:49320/fkljflkfjelk
为您提供默认的 IIS 页面,而只需附加 .aspx 即可Application_Error
因此,如果您想处理所有错误,听起来您需要启用 customErrors/httpErrors。
对于 IIS , 添加<system.web>
:
<customErrors mode="On" redirectMode="ResponseRewrite">
<error statusCode="404" redirect="/404.aspx"/>
<error statusCode="500" redirect="/500.aspx"/>
</customErrors>
对于 IIS7+, 添加<system.webServer>
:
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/404.aspx" responseMode="ExecuteURL"/>
<remove statusCode="500"/>
<error statusCode="500" path="/500.aspx" responseMode="ExecuteURL"/>
</httpErrors>
如果有人发现它有用,我会留下原始答案。
我相信您需要从响应中清除现有的错误代码,否则 IIS 会忽略您的重定向以支持处理错误。还有一个布尔标志,TrySkipIisCustomErrors
,您可以针对较新版本的 IIS (7+) 进行设置。
所以,像这样:
void Application_Error(object sender, EventArgs e)
{
Exception TheError = Server.GetLastError();
Server.ClearError();
// Avoid IIS7 getting in the middle
Response.TrySkipIisCustomErrors = true;
if (TheError is HttpException && ((HttpException)TheError).GetHttpCode() == 404)
{
Response.Redirect("~/404.aspx");
}
else
{
Response.Redirect("~/500.aspx");
}
}