zoukankan      html  css  js  c++  java
  • mvc 捕获404和500 等

    之前一直以为HandleErrorAttribute 可以捕获到后面自己尝试了不行,又自己想自定义页面,发现不行,然后设置了<customErrors/>节点 又不符合SEO 返回statuscode=404 不利于搜索引擎抓取,看到孙大城 文章才发现原来

    随着ASP.NET MVC版本的更新,出现了HandleErrorAttribute,使用Filter以AOP的思想实现了针对于Action的异常处理。使用此Filter后,当程序中出现异常的时候,会去封装这些异常信息,然后路由自动转到该Controller对应的Error.cshtml中,如果此路径下没有改文件,则会到shared目录中寻找此文件。另外一个相关的是在Global.asax中的protected void Application_Error(object sender, EventArgs e)方法,是捕捉异常的最后一道防线,也就是说,这是最高层次的异常捕获处理逻辑。使用HandleErrorAttribute后,找到了Error.cshtml,则此时异常已经被捕获处理,所以不会再次被Application_Error捕获处理。此外,可以通过@model HandleErrorInfo 在Error.cshtml中定制显示异常信息。有一点需要注意的是,HandleErrorAttribute是在customErrors基础之上的,如果想使用HandleErrorAttribute,customErrors的Mode必须要设置为On或RemoteOnly. 否则,HandleErrorAttribute将不起作用。

    所以看到了,这个可以重写url。

    protected void Application_Error(object sender, EventArgs e)
    {
    var exception = Server.GetLastError();
    if (exception == null)
    return;
    var httpStatusCode = (exception is HttpException) ? (exception as HttpException).GetHttpCode() : 500; //这里仅仅区分两种错误
    var httpContext = ((HttpApplication)sender).Context;
    httpContext.ClearError();
    httpContext.Response.Clear();
    httpContext.Response.StatusCode = httpStatusCode;
    var shouldHandleException = true;
    HandleErrorInfo errorModel;

    var routeData = new RouteData();
    routeData.Values["controller"] = "error";

    switch (httpStatusCode)
    {
    case 404:
    routeData.Values["action"] = "notfound";
    errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), exception), "error", "notfound");
    break;

    default:
    routeData.Values["action"] = "index";
    Exception exceptionToReplace = null; //这里使用了EntLib的异常处理模块的一些功能
    //shouldHandleException = ExceptionPolicy.HandleException(exception, "LogAndReplace", out exceptionToReplace);
    errorModel = new HandleErrorInfo(exceptionToReplace, "error", "index");
    break;
    }

    if (shouldHandleException)
    {
    var controller = new errorController();
    controller.ViewData.Model = errorModel; //通过代码路由到指定的路径
    ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
    }
    }

  • 相关阅读:
    答题技巧总结(高项)
    系统集成 中英文对照 第一季
    系统集成管理项目工程师总结(别人发的 )
    系统集成管理项目工程师总结(别人发的 我觉得很有意思)
    熵、信息增益以及其他
    位运算
    二分查找排序
    在链表中漫游
    Levenshtein距离
    动态规划(dynamic programming)
  • 原文地址:https://www.cnblogs.com/zhian/p/6867481.html
Copyright © 2011-2022 走看看