.NET 6.0中AuthorizationFilterContext获取控制器实例及方法名咨询
在.NET 6.0的AuthorizationFilter中,AuthorizationFilterContext无法直接像旧版MVC 5那样获取控制器实例和方法名,可通过以下方式实现:
获取方法名与控制器类型
将ActionDescriptor强转为ControllerActionDescriptor(仅针对控制器中的Action),即可获取相关信息:
public void OnAuthorization(AuthorizationFilterContext context) { if (context.ActionDescriptor is ControllerActionDescriptor actionDescriptor) { // 获取被修饰的方法名称 string actionName = actionDescriptor.ActionName; // 获取控制器的类型 Type controllerType = actionDescriptor.ControllerTypeInfo.AsType(); } }
获取控制器实例
注意:在OnAuthorization执行阶段,框架尚未完成控制器的实例化,若需获取实例,需通过依赖注入容器或反射方式创建:
public void OnAuthorization(AuthorizationFilterContext context) { if (context.ActionDescriptor is ControllerActionDescriptor actionDescriptor) { Type controllerType = actionDescriptor.ControllerTypeInfo.AsType(); // 方式1:通过HttpContext的依赖注入容器获取实例(推荐,支持构造函数注入) var controllerInstance = context.HttpContext.RequestServices.GetService(controllerType); // 方式2:若控制器有无参构造函数,可直接反射实例化(不推荐,无法处理依赖注入) // var controllerInstance = Activator.CreateInstance(controllerType); } }
注意事项
- 强转
ControllerActionDescriptor前需做类型判断,避免非控制器Action场景(如Razor Page)出现异常。 - 通过依赖注入获取控制器实例时,需确保控制器的所有依赖已在DI容器中注册,否则会返回
null。
内容的提问来源于stack exchange,提问作者Marcelo Myara
相关产品推荐
相关产品推荐

