从AuthorizationHandlerContext对象获取控制器和操作名称

15

你好,我有一个自定义需求处理程序,接受AuthorizationHandlerContext context参数。

当我调试时,我可以看到上下文对象包含 Context.Resources.ActionDescription.ActionName

但是在编写代码时,我无法超越 Context.Resources

似乎下层未公开。 我想获取调用处理程序的操作名称和控制器名称。 我该怎么做?

3个回答

29
var mvcContext = context.Resource as AuthorizationFilterContext;
var descriptor = mvcContext?.ActionDescriptor as ControllerActionDescriptor;
if (descriptor != null)
{
    var actionName = descriptor.ActionName;
    var ctrlName = descriptor.ControllerName;      
}

5
你如何获取实际的实例,而不仅仅是动作和控制器的名称? - Matt Drouillard

3
尽管这个问题被标记为 ,我想补充一下,@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;

3

将 .NET 5 升级后,我之前从Carsten 的回答中成功使用的解决方案出现了问题。现在以下解决方法对我有效:

var routeValues = (context.Resource as HttpContext).Request.RouteValues;
var controllerName = routeValues["controller"].ToString();
var actionName = routeValues["action"].ToString();

注意,这应该包括一些空值检查等。上面是一个简单的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接