从HandleErrorAttribute中获取Action的属性

时间:2018-02-22 15:33:22

标签: c# asp.net-mvc error-handling custom-attributes

我有一个位于控制器顶部的自定义错误属性:

public class JsonExceptionAttribute : HandleErrorAttribute
    {
        private ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        public override void OnException(ExceptionContext errorContext)
        {
            if (errorContext.ExceptionHandled) return;
            if (!errorContext.Action.Attributes.ContainsType(typeof(DontLogPathAttribute)) {    // THIS IS PSEUDOCODE
              _log.Error($"Oopsie. {HttpContext.Current.Request.Path}");
            }

        }
    }

在我的控制器顶部,我只需添加我的属性:

[JsonException]
public class UserController {
  public ActionResult JustAnAction{}

  [DontLogPath]
  public ActionResult SelfService(string myHash, int userId) {}
}

如果出现错误,我通常会记录Api-Call的路径。但是有一些我不想做的动作。这些案例具有DontLogPathAttribute(这只是一个空的属性类)

在ExceptionHandling(OnException)中,我想知道这个属性是否存在。但是在exceptionContext中我甚至找不到确定当前Action的属性。

错误日志之前的行是纯Pseudocode,它显示了我想要实现的目标。可以这样做吗?

(我在SO中看到了一些类似的问题,但在那些情况下,它从来都不是必须处理的 ExceptionContext 。)

1 个答案:

答案 0 :(得分:1)

这应该做的工作

    public override void OnException(ExceptionContext errorContext)
    {
        string actionName = errorContext.RouteData.Values["action"] as string;

        MethodInfo method = errorContext.Controller.GetType().GetMethods()
            .FirstOrDefault(x => x.DeclaringType == errorContext.Controller.GetType() 
                            && x.Name == actionName);

        IEnumerable<Attribute> attributes = method.GetCustomAttributes();

        //DoStuff
    }