在Application_Error中将异常转换为HTTP 404响应

时间:2010-05-11 04:41:02

标签: asp.net error-handling http-status-code-404 application-error

首先,快速完成我想要实现的目标:将特定异常转换为HTTP 404,以便ASP.NET可以进一步处理

我正在以这种方式处理ASP.NET(MVC2)中的异常:

    protected void Application_Error(object sender, EventArgs e) {
        var err = Server.GetLastError();
        if (err == null)
            return;
        err = err.GetBaseException();

        var noObject = err as ObjectNotFoundException;
        if (noObject != null)
            HandleObjectNotFound();

        var handled = noObject != null;
        if (!handled)
            Logger.Fatal("Unhandled exception has occured in application.", err);
    }

    private void HandleObjectNotFound() {
        Server.ClearError();
        Response.Clear();
        // new HttpExcepton(404, "Not Found"); // Throw or not to throw?
        Response.StatusCode = 404;
        Response.StatusDescription = "Not Found";
        Response.StatusDescription = "Not Found";
        Response.Write("The whole HTML body explaining whata 404 is??");
    }

问题是我无法配置默认customErrors来使用它。如果是on,则它永远不会重定向到customErrors<error statusCode="404" redirect="404.html"/>中指定的网页。

我还尝试从处理程序中引发new HttpExcepton(404, "Not Found"),但响应代码为200,我不明白为什么。

所以问题是:

  1. AnException转换为HTTP 404响应的正确方法是什么?
  2. 在处理Application_Error中的异常时,customErrors部分如何工作?
  3. 为什么抛出HttpException(404)呈现(空白)页面成功(200)状态?
  4. 谢谢,
    德米特里。

1 个答案:

答案 0 :(得分:2)

简而言之,如果您在Application_Error中手动设置HTTP状态,则会失去使用customErrors部分处理程序的可能性,因为您调用了Server.ClearError()。

在Application_Error之前处理异常或从HttpException派生异常。

  • 将AnException转换为HTTP 404响应的正确方法是什么?

最好在Controller中处理异常。您可以引入基类控制器并处理自定义HandleError属性中的大多数异常。您可以抛出HttpException,它们将由customErrors部分处理程序正确处理。

您还可以从HttpException(404)派生ObjectNotFoundException异常

Application_Error是处理异常的最后机会。您只有Response API来处理它。您可以手动设置状态代码并写入响应或手动触发重定向到自定义错误页面或调用Server.TransferRequest()到现有的html或aspx文件(而不是控制器操作)。在当前的asp.net版本中,您无法在Application_Error方法中设置或更改Server.GetLastError,只能检索或清除它。

  • 在处理Application_Error中的异常时,customErrors部分如何工作?

通过调用Server.ClearError(),您还可以清除当前请求错误,因此它不会被customErrors部分处理程序处理

  • 为什么抛出HttpException(404)呈现(空白)页面成功(200)状态?

你不应该在Application_Error方法中抛出任何异常。异常意味着您的错误处理失败。