[ASP.NET MVC]在ASP.NET MVC WEB网站应用程序开发中如何处理全局错误(403错误,404错误等等)?

ASP.NET MVC 作者: Rector 405阅读 0评论 0收藏 收藏本文

郑重申明:本文未经许可,禁止任何形式转载

问题描述

在ASP.NET MVC WEB网站应用程序开发中,如何处理全局错误(403错误,404错误等等)?
需要将所有的全局错误拦截并跳转到一个特定的错误Razor视图引擎页面,比如使用控制器ErrorController来展示错误页面,ErrorController的代码类似如下:

public class ErrorController : Controller
{
    public ViewResult NotFound () { return View(); }
    public ViewResult Forbidden () { return View(); }
    public ViewResult Default ()
    {
        var ex = ObtainExceptionFromSomewhere();
        if(ex is MySpecialDomainException)
            return View("MySpecialDomainException", new ErrorModel { Exception = ex });

        return View("GeneralError", new ErrorModel { Exception = ex });
    }
}

现在,网上也有不少资料可以处理这样类似的错误,如下:

  • 使用Controller.OnException()处理
  • 使用ErrorFilter处理
  • web.config配置文件中配置customErrors节点处理
  • 在全局处理文件Global.asax文件中,使用方法Appliation_Error处理

以上哪种方式实现更好呢?如何实现呢?

方案一

在ASP.NET MVC WEB网站应用程序开发中,处理全局错误(403错误,404错误等等)最好的方式是在全局处理文件Global.asax中来处理。因为我们可以在全局处理文件Global.asax中拦截所有的错误(比如:Ajax请求、403错误、404错误以及 所有的未知错误),同时,在全局处理文件Global.asax中,我们还可以获取请求的上下文信息,以方便我们对数据的分析可后续的处理。

以下是一个使用全局处理文件Global.asax拦截并处理全局错误的示例代码片段,如:

protected void Application_Error()
{
    HttpContext httpContext = HttpContext.Current;
    if (httpContext != null)
    {
        //获取当前请求的上下文信息
        RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
        //判断当前请求是否是AJAX请求
        if (requestContext.HttpContext.Request.IsAjaxRequest())
        {
            httpContext.Response.Clear();
            string controllerName = requestContext.RouteData.GetRequiredString("controller");
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
            IController controller = factory.CreateController(requestContext, controllerName);
            ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);

            JsonResult jsonResult = new JsonResult
            {
                Data = new { success = false, serverError = "500" },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            jsonResult.ExecuteResult(controllerContext);
            httpContext.Response.End();
        }
        else
        {
            httpContext.Response.Redirect("~/Error");
        }
    }
}

阅读了该文章的人还浏览了...

本文永久链接码友网 » [ASP.NET MVC]在ASP.NET MVC WEB网站应用程序开发中如何处理全局错误(403错误,404错误等等)?

发布于: 2018-05-11 07:37:26
分享扩散: