发布到IIS时,Application_Error不再触发

时间:2010-10-22 16:46:16

标签: c# asp.net iis-7.5

好的,我的Global.asax文件中有以下代码:

void Application_Error(object sender, EventArgs e)
{
    // Code that runs when an unhandled error occurs
        Exception objError = Server.GetLastError().GetBaseException();

        Response.Redirect(
            String.Format(
            "/Error/{0}/{1}",
            ((HttpException)objError).GetHttpCode(),
            Request.RawUrl));
}

提供整洁而整洁的错误网址,例如“/ Error / 404 / TheNameOfTheRequestedPage”。这可以在VS 2008中正常工作,但是一旦发布到我的本地机器,我就会得到默认的错误页面:

  

错误摘要

     

HTTP错误404.0 - 未找到

     

您正在寻找的资源   被删除,更改名称,或   暂时不可用

任何人都知道如何做到这一点?我选择不使用system.web / customErrors,因为我没有从那里访问Server.GetLastError()(或者至少它从来没有为我工作),我想得到http代码。

2 个答案:

答案 0 :(得分:2)

这很可能与您触发IIS Http错误有关,该错误在节点下的web.config中定义

<system.webServer>    
    <httpErrors>
    </httpErrors>    
<system.webServer>

如果问题是您要返回404的响应代码并获取IIS 404页面,则需要执行此操作

Response.TrySkipIisCustomErrors = true;

在让响应完成之前,IIS将拦截错误。

如果你自己设置状态代码,这完全是不直观的。我试图想办法在Microsoft Connect上提交一个错误,手动设置http错误代码不会自动设置TrySkipIisCustomErrors,但似乎无法找出任何相关产品提交给它。

答案 1 :(得分:0)

我遇到了类似的问题,并且在重定向之前调用Server.ClearError()确实解决了问题。

在你的情况下,我会写

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs 
        Exception objError = Server.GetLastError(); 
        if(objError is HttpException){
          //Need to clear the error, otherwise the buil-in redirect would occure
          Server.ClearError(); 
          Response.Redirect( 
              String.Format( 
              "/Error/{0}/{1}", 
              ((HttpException)objError).GetHttpCode(), 
              Request.RawUrl)); 
        }
} 

请注意,Server.GetLastError()。GetBaseException()返回 base 异常,它并不总是HttpException,您要查找的异常只是GetLastError()。