在ASP.NET MVC 5中处理404,403,500个http代码

时间:2014-03-13 00:42:43

标签: c# asp.net asp.net-mvc iis asp.net-mvc-5

我花了一整天时间尝试为HTTP错误实现自定义处理程序。 我正在使用MVC 5和IIS 7.有很多好的建议HERE。由于我不仅需要注意404,我还是尝试了THIS选项。

最终我需要能够处理所有这些案件

应该能够处理所有不匹配的路线     本地主机/ 404_test /测试/检验/测试/检验/23分之12

应该能够处理HTTP 500     从动作中抛出异常

应该能够处理例如400的所有html错误。     本地主机/ 404_test / DDSA

应该能够处理“像url这样的文件扩展名”     本地主机/ 404_test / test.cdd

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

之前,对于不匹配的路线来说是一样的
<httpErrors errorMode="Custom" existingResponse="PassThrough" >

以下是不匹配案例的路线图:

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

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

Web.config

<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>

1 个答案:

答案 0 :(得分:0)

这是我之前在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>

在Global.asax中,处理&#34;查看未找到&#34; MVC视图引擎抛出的错误:

    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);
        }
    }

我不希望不必测试错误消息内容,但我找不到更好的方法来区分此错误与其他InvalidOperationExceptions。

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

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