如何获取将在给定请求时调用的控制器操作的MethodInfo?

时间:2012-05-30 10:05:41

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

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

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

那么,我如何计算出RequestContext给出的动作?

显然,将控制器和动作名称从RouteData中取出会更加复杂,因为操作方法通常会超载等。

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

3 个答案:

答案 0 :(得分:9)

这是您的扩展方法。如果您正在对控制器进行依赖注入(非参数构造函数),则需要使用反射枚举控制器构造函数,或者使用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;
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

如果您仍然感兴趣,也许我可以深入了解它。

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