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

Dmy*_*iak 5 asp.net error-handling application-error http-status-code-404

首先,快速完成我想要实现的目标:将特定异常转换为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??");
    }
Run Code Online (Sandbox Code Playgroud)

问题是我无法配置默认值customErrors来使用它.如果是,on那么它永远不会重定向到以下指定的页面customErrors:<error statusCode="404" redirect="404.html"/>.

我也尝试new HttpExcepton(404, "Not Found")从处理程序中提出但是响应代码是200我不明白的原因.

所以问题是:

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

谢谢,
德米特里.

小智 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 方法中抛出任何异常。异常意味着您的错误处理失败。