5

首先,快速了解我想要实现的目标:将特定异常转换为 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转换为 HTTP404响应的正确方法是什么?
  2. customErrors在 Application_Error 中处理异常时,部分如何工作?
  3. 为什么抛出 HttpException(404) 会以成功 (200) 状态呈现(空白)页面?

谢谢,
德米特里。

4

1 回答 1

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

于 2010-08-03T08:35:39.430 回答