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

Geo*_*ett 7 c# asp.net-mvc-routing asp.net-mvc-2

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

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

那么,我怎么能弄清楚给定的动作是什么RequestContext

显然,将控制器和动作名称排除在外是比较复杂的,RouteData因为通常会出现动作方法的重载等.

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

Dev*_*ner 10

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

  • 类型名称通常与路径名称不同.例如,家庭控制器的类型通常是"HomeController",第一次尝试找到控制器名称时不会匹配,这将是"Home".此外,这忽略了区域的使用. (2认同)

Ste*_*loy 2

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