C# 在给定请求的情况下,如何获取将被调用的控制器操作的MethodInfo?

C# 在给定请求的情况下,如何获取将被调用的控制器操作的MethodInfo?,c#,asp.net-mvc-2,asp.net-mvc-routing,C#,Asp.net Mvc 2,Asp.net Mvc Routing,我有一个控制器和操作,负责处理403,因为用户的角色不正确。它可以访问导致异常的原始RequestContext 我希望能够做的是用他们所做的描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括在电子邮件中的描述 那么,在给定RequestContext的情况下,我如何计算出将调用什么操作? 显然,这比从RouteData中获取控制器和动作名称要复杂得多,因为动作方法等经常会重载 一旦我有了MethodInfo,那么就很容易获得属性等。试图回顾性地解决这个问题有点麻烦,由于您可能需要使

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

我希望能够做的是用他们所做的描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括在电子邮件中的描述

那么,在给定
RequestContext
的情况下,我如何计算出将调用什么操作?

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


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

试图回顾性地解决这个问题有点麻烦,由于您可能需要使用反射来发现正确的方法,因此在授权失败的代码中插入所需的数据到
HttpContext.Items
可能会更简单?然后可以通过
RequestContext.HttpContext.Items

从您的处理方法获得它。如果在控制器(非无参数构造函数)上执行依赖项注入,则需要使用反射枚举控制器构造函数,或者使用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;
    }
}

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

  • 问题:
  • 答复:
如果这仍然是你感兴趣的,也许我可以更深入地研究它


我的问题不是从你的URL开始的,而是从控制器和操作名称开始的,还有http方法(GET、POST…。

谢谢!整个上午都在想办法解决这个问题。为了其他人的利益,我使用这种方法在MvcSiteMapProvider的自定义ACL提供程序中获取操作的自定义属性。在这种情况下,我可以访问RequestContext,但不能访问ActionExecutingContext的全部细节,就像在普通操作筛选器中一样。类型名称通常与路由名称不同。例如,主控制器的类型通常为“HomeController”,第一次尝试查找控制器名称(即“home”)时不会与之匹配。此外,这忽略了区域的使用。值得注意的是,
HttpContext.Items
的生命周期是每个请求。执行请求后,
Items哈希表
中存储的任何信息都将消失。