global.asax中的自定义错误

时间:2014-08-15 05:48:57

标签: c# asp.net

在我的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文件来处理自定义错误?

enter image description here

感谢。

2 个答案:

答案 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正在寻找一个页面而没有找到它。

确保:

  1. 创建了404.aspx
  2. 来自web.config的
  3. customErrors标记不存在。