ApiController获取ActionName为何繁琐?有无更简便实现方案?
在WebApi的ApiController中获取控制器名与动作名的简便方案
确实啊,传统MVC控制器里拿控制器和动作名太省心了,ControllerContext.RouteData里直接就能掏出来,但到了System.Web.Http.ApiController这儿,因为WebApi的路由机制和MVC不一样,确实得多费点劲。你说用R#精简了代码,我这儿分享几个更简洁的实现思路,应该能帮你在通用权限判断逻辑里少写点重复代码。
直接通过ActionContext提取(最推荐)
WebApi的ActionContext里其实已经封装好了这些元数据,根本不用去手动解析路由数据:// 获取当前动作名 var actionName = ActionContext.ActionDescriptor.ActionName; // 获取当前控制器名(自动去掉了Controller后缀) var controllerName = ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName;这个方法最靠谱,不管你路由规则怎么配,
ActionDescriptor都是框架直接提供的动作元数据,不会因为路由模板里的自定义占位符出问题。封装成扩展方法复用
如果你的通用权限判断要在很多控制器里用,不如把这俩逻辑封装成扩展方法,用起来更顺手:public static class ApiControllerExtensions { public static string GetCurrentActionName(this ApiController controller) { return controller.ActionContext.ActionDescriptor.ActionName; } public static string GetCurrentControllerName(this ApiController controller) { return controller.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName; } }之后在控制器里直接这么调用就行:
var currentAction = this.GetCurrentActionName(); var currentController = this.GetCurrentControllerName();在过滤器中直接获取(权限判断场景更适用)
既然你是做用户可访问动作的判断,大概率会用到WebApi的过滤器(比如AuthorizationFilterAttribute),这种场景下根本不用依赖ApiController实例,直接从HttpActionContext里拿就行:public class PermissionCheckFilter : AuthorizationFilterAttribute { public override void OnAuthorization(HttpActionContext actionContext) { var actionName = actionContext.ActionDescriptor.ActionName; var controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName; // 这里写你的权限判断逻辑 } }这种方式更符合WebApi权限控制的最佳实践,把权限逻辑和控制器代码解耦,也不用在每个控制器里重复写获取名称的代码。
这些方法都比手动解析RouteData稳定得多,毕竟是直接用框架提供的元数据容器,不用担心路由规则变化导致获取错误。
内容的提问来源于stack exchange,提问作者CularBytes
相关产品推荐
相关产品推荐

