【问题标题】:ASP.Net MVC - how to handle exception in JSON action (return JSON error info), but also publish the exception for filters?ASP.Net MVC - 如何处理 JSON 动作中的异常(返回 JSON 错误信息),但也发布过滤器的异常?
【发布时间】:2010-10-18 17:40:23
【问题描述】:

我正在使用过滤器来记录操作引发的异常,如下所示:

public override void OnActionExecuted(ActionExecutedContext filterContext) {
  if (filterContext.Exception != null) {
    //logger.Error(xxx);
  }
  base.OnActionExecuted(filterContext);
}

现在我想处理我的所有 JSON 操作以返回带有异常信息的 JSON 结果。这允许 Ajax 调用确定服务器上是否有任何错误,而不是接收错误页面源,这对 Ajax 来说是无用的。我已经在我的 AppControllerBase 中为 JSON 操作实现了这个方法:

public ActionResult JsonExceptionHandler(Func < object > action) {
  try {
    var res = action();
    return res == null ? JsonSuccess() : JsonSuccess(res);
  } catch (Exception exc) {
    return JsonFailure(new {
      errorMessage = exc.Message
    });
  }
}

这很好用,但显然 catch() 语句会阻止所有过滤器处理异常,因为实际上没有抛出异常。有什么办法可以让过滤器的异常可用(filterContext.Exception)?

【问题讨论】:

    标签: c# json asp.net-mvc exception filter


    【解决方案1】:

    您可以将异常存储在 RequestContext 中并在过滤器中拦截它。

    【讨论】:

      【解决方案2】:

      解决办法:

      行动:

      public ActionResult JsonExceptionHandler(Func < object > action) {
        try {
          var res = action();
          return res == null ? JsonSuccess() : JsonSuccess(res);
        } catch (Exception exc) {
          controller.ControllerContext.HttpContext.AddError(exc);
          return JsonFailure(new {
            errorMessage = exc.Message
          });
        }
      }
      

      过滤器:

      public override void OnActionExecuted(ActionExecutedContext filterContext) {
        var exception = filterContext.Exception ? ? filterContext.HttpContext.Error;
        if (exception != null) {
          //logger.Error(xxx);
        }
      
        if (filterContext.Result != null &&
          filterContext.HttpContext.Error != null) {
          filterContext.HttpContext.ClearError();
        }
      
        base.OnActionExecuted(filterContext);
      }
      

      【讨论】:

      • 请发布您的 JsonFailure && JsonSuccess
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多