我怎样才能将调用给出的请求控制器动作的MethodInfo的?(How can i get the

2019-09-17 15:35发布

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

我希望能够做的是装饰我的行动与他们所做的事情,然后让用户通知他们的经理,请求访问包含在电子邮件中描述的说明。

所以, 我怎么能制定出什么样的行动将被称为给出RequestContext

显然,这是更复杂,越来越控制器和动作名称出的RouteData因为有经常的操作方法等重载

一旦我有MethodInfo那么容易得到的属性等。

Answer 1:

试图解决它回顾是有点忌讳的,因为你可能需要使用反射来发现正确的方法-它可能是简单的插入所需的数据到HttpContext.Items作为代码的一部分其中授权失败? 然后,将可通过您的处理方法RequestContext.HttpContext.Items



Answer 2:

下面是你的扩展方法。 如果你做你的控制器(无参数的构造函数)的依赖注入,则需要使用反射来枚举控制器构造函数,或使用您的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;
    }
}


Answer 3:

我已经回答了我的问题,这是非常类似于此。

  • 问题: 我如何获得一个动作,给动作,控制器和地区名称的MethodInfo?
  • 答案: https://stackoverflow.com/a/13044838/195417

如果这是你的兴趣还在,也许我可以去钻研它。

我的问题并没有从URL作为你的开始,而是从控制器和动作的名称,也是HTTP方法(GET,POST ...)。



文章来源: How can i get the MethodInfo of the controller action that will get called given a request?