global.asax中的自定义错误

在我的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文件以记录exception。 有没有办法只使用global.asax文件处理自定义错误?

在此处输入图像描述

谢谢。

编辑:

答案并不明显,但这似乎可以解释它: 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 <= 6 ,添加到

     

对于IIS7 + ,添加到

       

如果有人发现它有用,我会留下原始答案。


我相信你需要从响应中清除现有的错误代码,否则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"); } } 

看起来IIS正在寻找一个页面而没有找到它。

确保:

  1. 404.aspx已创建
  2. web.config中的customErrors标记不存在。