7

由于用户角色不正确,我有一个负责处理 403 的控制器和操作。它可以访问RequestContext导致异常的原始文件。

我想做的是用他们所做的描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述。

那么,我怎样才能算出在给定 a 时会调用什么动作RequestContext

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

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

4

3 回答 3

11

这是适合您的扩展方法。如果您在控制器上进行依赖注入(非无参数构造函数),则需要使用反射枚举控制器构造函数,或使用 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;
    }
}
于 2012-07-18T22:01:12.150 回答
2

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

于 2012-05-30T13:13:16.390 回答
0

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

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

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

于 2012-10-24T08:05:35.783 回答