在WebApi 2应用程序中,可以从Global.Asax文件的 Application_BeginRequest 方法读取操作/控制器的属性吗?
目前,我可以获取控制器和操作名称,但不知道从那里读取自定义属性的最佳方法。
答案 0 :(得分:1)
解决方案1
使用反射。
注意:这假设您的所有操作名称对于控制器都是唯一的。
如果不是这样,我猜......这个解决方案会失败。
首先,您需要找到程序集。
这可以通过选择一个api的控制器来完成(当然,它们很少有其他方法可以找到所需的组件)
var assembly = typeof (HomeController).Assembly;
现在,我想你得到了控制器动作并以这种方式命名:
var routeData = RouteTable.Routes.GetRouteData(
new HttpContextWrapper(HttpContext.Current));
var actionName = routeData.GetRequiredString("action");
var controllerName = routeData.GetRequiredString("controller");
所以下一步是获得控制器的类型。 这可以通过
来完成//you don't need the full name
var controllerType = assembly.GetTypes().FirstOrDefault(m => m.Name == controllerName + "Controller");
或
var controllerType = assembly.GetType("<namespace>." + controllerName + "Controller");
然后你可以得到控制器的customAttributes
var controllerCustomAttributes = controllerType.GetCustomAttributes();
如果您需要动作属性,则需要获取与您的动作名称相对应的方法。
var actionType = controllerType.GetMethods().FirstOrDefault(x => x.Name == actionName );
然后再次获取自定义属性
var actionAttributes = actionType.GetCustomAttributes();
解决方案2
最好在所有操作上添加自定义ActionFilterAttribute
,并使用OnActionExecuting
。
例如,请参阅this。