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

  • 相关阅读:
    第一次个人编程作业
    第一次软工作业
    [Manacher]最长回文子串
    面向对象程序设计 总结作业
    面向对象程序设计 小黄衫晒单
    面向对象程序设计 作业三
    面向对象程序设计 作业二
    面向对象程序设计 作业一
    SSD/Memory技术学习拼图
    第一次结对编程作业
  • 原文地址:https://www.cnblogs.com/zhian/p/6867481.html
Copyright © 2020-2023  润新知