如何从Global.asax中的controller / Action读取和属性

时间:2016-07-14 09:48:49

标签: asp.net-mvc asp.net-web-api global-asax

在WebApi 2应用程序中,可以从Global.Asax文件的 Application_BeginRequest 方法读取操作/控制器的属性吗?

目前,我可以获取控制器和操作名称,但不知道从那里读取自定义属性的最佳方法。

1 个答案:

答案 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

相关问题