【问题标题】:Get controller and action name from AuthorizationHandlerContext object从 AuthorizationHandlerContext 对象获取控制器和动作名称
【发布时间】:2017-04-27 11:40:47
【问题描述】:
您好,我有一个接受 AuthorizationHandlerContext context 参数的自定义需求处理程序
当我调试时,我可以看到上下文对象包含
Context.Resources.ActionDescription.ActionName
但是在编写代码时我无法超越
上下文资源
似乎下层没有暴露。我想获取调用处理程序的操作名称和控制器名称。我该怎么做?
【问题讨论】:
标签:
asp.net
asp.net-mvc
asp.net-core
access-control
【解决方案1】:
var mvcContext = context.Resource as AuthorizationFilterContext;
var descriptor = mvcContext?.ActionDescriptor as ControllerActionDescriptor;
if (descriptor != null)
{
var actionName = descriptor.ActionName;
var ctrlName = descriptor.ControllerName;
}
【解决方案2】:
升级到 dotnet 5 后,我从 Carsten above 成功使用的解决方案停止工作。以下解决方法现在适用于我:
var routeValues = (context.Resource as HttpContext).Request.RouteValues;
var controllerName = routeValues["controller"].ToString();
var actionName = routeValues["action"].ToString();
注意这应该包括一些空检查等。上面是一个准系统示例。
【解决方案3】:
即使问题被标记为asp.net-mvc,我想补充一点,@AdemCaglin 的答案不适用于 Web API 控制器。以下代码适用于 API 和 MVC 控制器:
var endpoint = context.Resource as RouteEndpoint;
var descriptor = endpoint?.Metadata?
.SingleOrDefault(md => md is ControllerActionDescriptor) as ControllerActionDescriptor;
if (descriptor == null)
throw new InvalidOperationException("Unable to retrieve current action descriptor.");
var controllerName = descriptor.ControllerName;
var actionName = descriptor.ActionName;