【问题标题】: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】:

      即使问题被标记为,我想补充一点,@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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        • 2013-09-03
        • 1970-01-01
        相关资源
        最近更新 更多