一劳永逸地,什么是处理错误、异常和404';s在MVC中

本文关键字:MVC 异常 什么 处理 错误 一劳永逸 | 更新日期: 2023-09-27 17:58:21

有很多关于SO和web的文章试图优雅地处理404和异常。

根据我所读到的,最好的建议似乎是有一条404的路线:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "ErrorController", action = "PageNotFound" }
    );

然后,对于其他错误,请在控制器上设置HandleError属性,并在web.config中打开CustomErrors,以便转到error.cshtml页面。

然而,我已经读到,如果您得到一个异常,没有将HTTP代码设置为500,那么HandleError将不起作用。

我们最终能否制定出一个解决404的/异常/ASP.Net错误的答案/最佳实践,并将其应用于我们的所有项目?

感谢

一劳永逸地,什么是处理错误、异常和404';s在MVC中

我使用了一个简单的错误处理设置。漂亮又简单。更多信息,请访问http://erictopia.com/2010/04/building-a-mvc2-template-part-7-custom-web-errors-and-adding-support-for-elmah/

安装ELMAH并让它处理所有错误。

接下来创建一个错误控制器。添加这样一条包罗万象的路线:

routes.MapRoute(
    "ErrorHandler", // Route name
    "{*path}",      // URL
    new { controller = "Error", action = "Index" }
);

然后在web.config中添加以下部分:

<customErrors mode="RemoteOnly" defaultRedirect="/Error/Index">
        <error statusCode="403" redirect="/Error/NoAccess" />
        <error statusCode="404" redirect="/Error/NotFound" />
</customErrors>

无需设置404路由。在全局asax应用程序启动中,设置一个全局过滤器来捕获404控制器存在但不存在操作的地方,或者如果操作返回404结果。

        filters.Add(new HttpNotFoundFilterAttribute { Order = 99 });

其中筛选器是具有以下覆盖的ActionFilterAttribute:

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result !=null && 
            (filterContext.Result.GetType() == typeof(HttpNotFoundResult) )
        {
            //You can transfer to a known route for example
            filterContext.Result = new TransferResult(SomeAction, SomeController);
        }
    }

在Application_Error中,如果不存在控制器:

        Exception ex = Server.GetLastError();
        string uri = null;
        if (Context != null && Context.Request != null)
        {
            uri = Context.Request.Url.AbsoluteUri;
        }
        Exception baseEx = ex.GetBaseException();
         var httpEx = ex as HttpException;
         if ((httpEx != null && httpEx.GetHttpCode()==404) 
              || (uri != null && Context.Response.StatusCode == 404) )
             { /* do what you want. */ 
               //Example: show some known url
               Server.ClearError();
               Server.TransferRequest(transferUrl);
             }

为了避免为静态资源处理404,您应该在Windows 7或Windows 2008 R2上安装SP1以升级IIS7并在web.config中设置:

...
<modules runAllManagedModulesForAllRequests="false">
...