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

本文关键字:调用 控制器 MethodInfo 操作 请求 何获取 获取 | 更新日期: 2023-09-27 18:35:56

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

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

那么,我怎样才能计算出给定RequestContext会调用什么操作?

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

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

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

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

尝试追溯解决它有点像蠕虫,因为您可能需要使用反射来发现正确的方法 - 在授权失败的情况下,将所需数据作为代码的一部分插入HttpContext.Items可能会更简单?然后,它将从您的处理方法到RequestContext.HttpContext.Items .

我已经

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

  • 问题:如何获取操作、给定操作、控制器和区域名称的方法信息?
  • 答:https://stackoverflow.com/a/13044838/195417

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

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