如何获取给定请求时将调用的控制器操作的 MethodInfo
本文关键字:调用 控制器 MethodInfo 操作 请求 何获取 获取 | 更新日期: 2023-09-27 18:35:56
我有一个控制器和操作,负责处理 403,因为用户的角色不正确。它有权访问导致异常的原始RequestContext
。
我希望能够做的是用他们所做的事情的描述来装饰我的操作,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述。
那么,我怎样才能计算出给定RequestContext
会调用什么操作?
显然,这比从RouteData
中获取控制器和操作名称更复杂,因为操作方法等经常存在重载。
一旦我有了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 等)开始的。