繁体   English   中英

ASP.Net MVC - 如何处理 JSON 操作中的异常(返回 JSON 错误信息),同时发布过滤器的异常?

[英]ASP.Net MVC - how to handle exception in JSON action (return JSON error info), but also publish the exception for filters?

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

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)?

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

解决方案:

行动:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM