处理404,403,500 http代码在ASP.asp.net MVC 5

本文关键字:asp ASP net MVC 代码 http 处理 | 更新日期: 2023-09-27 17:49:45

我花了一整天的时间来尝试实现HTTP错误的自定义处理程序。我使用MVC 5和IIS 7。这里有很多好的建议。因为我需要注意的不仅仅是404,我已经尝试了这个选项。

最终我需要能够处理所有这些情况

应该能够处理所有不匹配的路由localhost/404 _t/测试/测试/测试/测试/12/23

应该能够处理HTTP 500从操作

抛出异常

应该能够处理所有的html错误,例如400。localhost/404 _t/ddsa

应该能够处理"文件扩展名如url"localhost/404 _t/test.cdd

使用所提供的链接中的代码也通过更新web。配置如下所示,我能够处理除"像url这样的文件扩展名"的所有情况。我收到的是空白页。看起来IIS正在覆盖响应。在添加

之前,对于不匹配的路由也是如此
<httpErrors errorMode="Custom" existingResponse="PassThrough" >

以下是不匹配情况的路由图:

        routes.MapRoute("NotFound", "{*url}",
            new { controller = "Error", action = "NotFound" });

有什么建议如何实现这个?我看到stackoverflow.com完全按照我想要的方式工作,但我不知道它是如何实现的。

网络。配置

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
     <httpErrors errorMode="Custom" existingResponse="PassThrough" >
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" subStatusCode="-1" responseMode="ExecuteURL" path="/Error/NotFound" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" subStatusCode="-1" responseMode="ExecuteURL" path="/Error/ServerError" />
    </httpErrors>
  </system.webServer>

处理404,403,500 http代码在ASP.asp.net MVC 5

这是我之前在MVC3应用程序中实现的解决方案,所以这是一段时间前。它应该处理任何无效的URL以及从应用程序抛出的未处理的异常。您应该能够将此代码与上面链接中的代码结合起来处理其他40x错误。此代码在www.carbsandcals.com上运行。

在web . config中

:

<httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="500" subStatusCode="-1" />
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="400" subStatusCode="-1" />
    <error statusCode="400" prefixLanguageFilePath="" path="/Error/Error/400" responseMode="ExecuteURL" />
    <error statusCode="404" prefixLanguageFilePath="" path="/Error/Error/404" responseMode="ExecuteURL" />
    <error statusCode="500" prefixLanguageFilePath="" path="/Error/Error/500" responseMode="ExecuteURL" />
</httpErrors>

在全球。asax,用来处理MVC视图引擎抛出的"view not found"错误:

    protected void Application_Error()
    {
        Exception ex = Server.GetLastError();
        bool handleError = false;
        int errorCode = 500;
        if (handleError = (ex is InvalidOperationException && ex.Message.Contains("or its master was not found or no view engine supports the searched locations. The following locations were searched")))
        {
            errorCode = 404;
        }
        else if (handleError = ex is HttpException)
        {
            errorCode = ((HttpException)ex).GetHttpCode();
        }
        if (handleError)
        {
            Server.ClearError();
            Server.TransferRequest("/error/error/" + errorCode);
        }
    }

我宁愿不测试错误消息的内容,但我找不到一个更好的方法来区分这个错误与其他invalidoperationexception。

警告:虽然这将处理HttpRequestValidationException错误,但错误页面的处理可能会抛出更多相同类型的异常(因为URL仍然无效)。我注意到这与Html.RenderPartial和ASCX以及与SiteMap相互作用。在这种情况下,最好重定向到简单视图或静态页面。

错误控制器设置Response.StatusCode,以便将正确的HTTP代码发送回客户端。