在我的global.asax
文件中,我有以下代码:
void Application_Error(object sender, EventArgs e)
{
Exception TheError = Server.GetLastError();
if (TheError is HttpException && ((HttpException)TheError).GetHttpCode() == 404)
{
Response.Redirect("~/404.aspx");
}
else
{
Response.Redirect("~/500.aspx");
}
}
当我导航到不存在的页面时,我会得到通用错误页面。我不希望web.config
中出现与自定义错误相关的任何内容,因为我的计划是将代码添加到global.asax
文件以记录异常。有没有办法只使用global.asax文件来处理自定义错误?
感谢。
答案 0 :(得分:5)
答案不明显,但这似乎解释了它: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&lt; = 6 ,请添加到<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");
}
}
答案 1 :(得分:1)
看起来IIS正在寻找一个页面而没有找到它。
确保: