【问题标题】:In ASP.NET MVC how to refactor try/catch and return JSON error message?在 ASP.NET MVC 中如何重构 try/catch 并返回 JSON 错误消息?
【发布时间】:2015-01-29 22:23:11
【问题描述】:

如何最好地在新的 ASP.NET MVC 应用程序中创建一个基本控制器,该应用程序将包含样板代码来处理派生控制器中每个操作的所有 try/catch 例程,并在登录到 Nlog 后返回标准 JSON 错误消息。我还想处理 404 错误以重定向到自定义 404 视图。我的目标是使用 OWIN cookie 身份验证,并希望在 cookie 过期时退出。我的所有操作都将返回 JsonResult 并通过 jQuery Ajax 调用。

在以前的项目中,我使用了以下方法:

Global.asax.cs

  protected void Application_Error(object sender, EventArgs e)
    {
        Exception lastError = Server.GetLastError();
        Server.ClearError();

        var statusCode = 0;

        statusCode = lastError.GetType() == typeof(HttpException) ? ((HttpException)lastError).GetHttpCode() : 500;

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("statusCode", statusCode);
        routeData.Values.Add("exception", lastError);

        if (new HttpRequestWrapper(HttpContext.Current.Request).IsAjaxRequest())
        {
            routeData.Values.Add("action", "Ajax");     
        }
        else
        {
            routeData.Values.Add("action", "Index");
        }

        var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData);

        IController controller = new ErrorController();
        controller.Execute(requestContext);

        Response.End();
    }

ErrorController.cs

 public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };

        Response.StatusCode = statusCode;

        return View(model);
    }

    public JsonResult Ajax(int statusCode, Exception exception, Dictionary<string,string> validationErrors = null)
    {
        var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };

        if (exception.GetType() == typeof (DbEntityValidationException))
        {
            model.ValidationErrors = null;
        }
        else
        {
            model.ValidationErrors = validationErrors;
        }

        Response.StatusCode = statusCode;

        return Json(model, JsonRequestBehavior.AllowGet);
    }
}

【问题讨论】:

    标签: asp.net-mvc json error-handling refactoring


    【解决方案1】:

    最好的方法是像这样扩展HandleErrorAttribute

    public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            // Execute the normal exception handling routine...
            base.OnException(filterContext);            
    
            // Verify if AJAX request...
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                // Use Json in case of AJAX request...
                var result = new JsonResult();                
                result.Data = new { Error = filterContext.Exception.Message };
    
                filterContext.Result = result;
            }
        }
    }
    

    然后,您只需在 FilterConfig 类中的 App_Start 文件夹中注册该属性,如下所示:

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new AjaxAwareHandleErrorAttribute());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2011-11-07
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      相关资源
      最近更新 更多