【问题标题】:How can i get the MethodInfo of the controller action that will get called given a request?如何获取将在给定请求时调用的控制器操作的 MethodInfo?
【发布时间】:2012-06-04 13:29:18
【问题描述】:

由于用户角色不正确,我有一个负责处理 403 的控制器和操作。它可以访问导致异常的原始RequestContext

我想做的是用他们所做的描述来装饰我的操作,然后允许用户通知他们的经理,请求访问权限,包括电子邮件中的描述。

那么,如果给定RequestContext,我该如何计算出将调用什么操作?

显然这比从RouteData 中获取控制器和动作名称更复杂,因为动作方法经常重载等。

一旦我有了MethodInfo,就很容易获得属性等。

【问题讨论】:

    标签: c# asp.net-mvc-2 asp.net-mvc-routing


    【解决方案1】:

    这是适合您的扩展方法。如果您在控制器上进行依赖注入(非无参数构造函数),则需要使用反射枚举控制器构造函数,或使用 IOC 容器来实例化控制器,而不是使用 Activator.CreateInstance。此外,这可以很容易地修改为使用类似的上下文,如 ExceptionContext 或 HttpContext。

    public static class RequestContextExtensions
    {
        public static MethodInfo GetActionMethod(this RequestContext requestContext)
        {
            Type controllerType = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.Name == requestContext.RouteData.Values["controller"].ToString());
            ControllerContext controllerContext = new ControllerContext(requestContext, Activator.CreateInstance(controllerType) as ControllerBase);
            ControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
            ActionDescriptor actionDescriptor = controllerDescriptor.FindAction(controllerContext, controllerContext.RouteData.Values["action"].ToString());
            return (actionDescriptor as ReflectedActionDescriptor).MethodInfo;
        }
    }
    

    【讨论】:

    • 谢谢!整个上午都在试图弄清楚这一点。为了其他人的利益,我使用这种方法在 MvcSiteMapProvider 的自定义 ACL 提供程序中获取操作的自定义属性。在这种情况下,我可以访问 RequestContext 但不能访问 ActionExecutingContext 的完整详细信息,就像您在普通操作过滤器中获得的那样。
    • 类型名称通常与路由名称不同。例如,家庭控制器的类型通常为“HomeController”,第一次尝试查找控制器名称时不会匹配到“Home”。此外,这忽略了区域的使用。
    【解决方案2】:

    试图回顾性地解决它有点像蠕虫,因为您可能需要使用反射来发现正确的方法 - 将所需的数据作为一部分插入到 HttpContext.Items 中可能会更简单授权失败的代码?然后可以通过RequestContext.HttpContext.Items从您的处理方法中获得它。

    【讨论】:

    • 值得注意的是,HttpContext.Items 的生命周期是每个请求的。存储在Items Hashtable 中的任何信息都将在请求执行后消失。
    【解决方案3】:

    我已经回答了我自己的问题,与此非常相似。

    如果这仍然是你的兴趣,也许我可以更深入地研究它。

    我的问题不是从您的 URL 开始,而是从控制器和操作名称以及 http 方法(GET、POST...)开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多