由于用户角色不正确,我有一个负责处理 403 的控制器和操作。它可以访问RequestContext
导致异常的原始文件。
我想做的是用他们所做的描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述。
那么,我怎样才能算出在给定 a 时会调用什么动作RequestContext
?
显然,这比从中获取控制器和动作名称更复杂,RouteData
因为通常存在动作方法等的重载。
一旦我有了,MethodInfo
就很容易获得属性等。
由于用户角色不正确,我有一个负责处理 403 的控制器和操作。它可以访问RequestContext
导致异常的原始文件。
我想做的是用他们所做的描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述。
那么,我怎样才能算出在给定 a 时会调用什么动作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
.
我已经回答了我自己的问题,这与此非常相似。
如果这仍然是你的兴趣,也许我可以更深入地研究它。
我的问题不是从您的 URL 开始,而是从控制器和操作名称以及 http 方法(GET、POST ...)开始。