Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在应用程序错误中将异常转换为HTTP 404响应_Asp.net_Error Handling_Http Status Code 404_Application Error - Fatal编程技术网

Asp.net 在应用程序错误中将异常转换为HTTP 404响应

Asp.net 在应用程序错误中将异常转换为HTTP 404响应,asp.net,error-handling,http-status-code-404,application-error,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.G

首先,快速实现我想要实现的目标:将特定异常转换为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??");
    }
问题是我无法配置default
customErrors
来处理它。当它处于打开状态时,它从不重定向到在自定义错误:
中指定的页面

我还试图从处理程序中提出
新的HttpExcepton(404,“未找到”)
,但是响应代码是
200
,我不明白为什么

因此,问题是:

  • 将异常转换为HTTP
    404
    响应的正确方法是什么
  • 处理应用程序错误中的异常时,
    customErrors
    部分如何工作
  • 为什么抛出HttpException(404)会以成功(200)状态呈现(空白)页面
  • 谢谢,

    Dmitry.

    简单地说,如果您在应用程序错误中手动设置HTTP状态,您将失去使用customErrors节处理程序的可能性,因为您调用了Server.ClearError()

    在应用程序出错之前处理异常,或从HttpException派生异常

    • 将异常转换为HTTP 404响应的正确方法是什么
    最好在控制器中处理异常。您可以在自定义HandleError属性中引入基类控制器并处理大多数异常。您可以抛出HttpException,它将由customErrors节处理程序正确处理

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

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

    • 在处理应用程序错误中的异常时,customErrors部分是如何工作的
    通过调用Server.ClearError()还可以清除当前请求错误,因此customErrors节处理程序不会处理该错误

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

    在应用程序错误方法中不应引发任何异常。异常意味着您的错误处理失败。

    最好在Controller中处理异常
    -也许吧,但它不会捕获我确实需要的非Mvc异常<代码>从HttpException派生ObjectNotFoundException异常-不可能,它是来自数据层的异常,与HTTP无关<代码>您可以手动设置状态代码并写入响应-在这种情况下,
    自定义错误
    配置将不会启动<代码>手动触发重定向到自定义错误页面-那我们为什么会有
    *自定义*错误
    部分。这么简单的事情,但有这么多障碍,-只要在给定的异常上启动customError处理程序即可。Dmitry,我同意您的看法,在应用程序错误中更改Server.GetLastError即可。但是当前的ASP.NETAPI不允许这样做。“但它不会捕获我确实需要的非Mvc异常。”-您应该能够通过使用标准或实现自定义HandleError属性来捕获控制器级别的所有异常。尽量避免在视图渲染期间引发异常。如果您在视图呈现期间遇到异常,那么本文可能会对您有用:Andrej,我无法捕获控制器级别的所有异常,因为应用程序中有常规WebForms页面和其他非MVC部分,因此处理所有错误的唯一位置是全局应用程序对象。这很好,我只是不知道如何从那里“返回”404,这样它将由
    customErrors
    处理。Dmitry,在应用程序错误中不能这样做。但您可以轻松地实现与customError节处理程序类似的功能。检查此链接: