【发布时间】:2015-09-11 19:13:35
【问题描述】:
理想情况下,我想创建一个从 ActionFilterAttribute 继承的过滤器,我可以在 Global.asax 中应用它,为我的应用程序中的所有操作创建性能计数器。这个问题很简单,但问题是我希望性能计数器具有以它们的名义附加到的操作的方法签名。但是,我找不到一种方法来提取在构造过程中附加属性的方法的方法名称。这导致我必须将属性单独应用于每个操作并将其签名作为参数传递。但是,这会带来明显的问题(即方法签名的更新不会自动与性能计数器命名同步)。
为了简化问题,如果我将属性附加到任何类型的方法,我可以访问它附加到的方法的名称/签名吗?我正在寻找一个通用的解决方案,它也适用于不是从 ActionFilterAttribute 派生的属性。
public class SomeAttribute : ActionFilterAttribute
{
public string FunctionSignature { get; set; }
public SomeAttribute()
{
this.FunctionName = { HOW DO I GET THE NAME OF THE METHOD I'M ON WITHOUT PASSING IT IN AS AN INPUT ARGUMENT? }
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
// Some code to update perf counter(s) with recorded time that will use string.Format("{0}: Avg. Time or Something", this.FunctionSignature).
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Some code to record time.
}
}
[SomeAttribute]
public void SomeMethod()
{
// Some code.
}
【问题讨论】:
-
你试过
filterContext.ActionDescriptor.ActionName吗? -
还有
filterContext.RouteData.Values["action"]? -
ActionFilter对动作有意义,而不是对任何类型的方法。 -
我没有这样做,因为我明确地想要一个通用的解决方案,它甚至可以用于不是从 ActionFilter 派生的属性。理想情况下,我想在构造函数中获取它。
-
我认为您应该使用外部方法,该方法将使用反射来查找具有此或其他属性的操作,并将信息写入日志。您无法找到将属性附加到其构造函数 (AFAIUI) 中的哪个方法。
标签: c# asp.net .net asp.net-mvc action-filter