我有一个控制器和操作,负责处理403s,因为用户没有正确的角色。它可以访问导致异常的原始RequestContext
。
我希望能够做的是用他们所做的事情描述来装饰我的行为,然后允许用户通知他们的经理,请求访问,包括电子邮件中的描述。
那么,我如何计算出RequestContext
给出的动作?
显然,将控制器和动作名称从RouteData
中取出会更加复杂,因为操作方法通常会超载等。
一旦我拥有MethodInfo
,就很容易获得属性等。
答案 0 :(得分:9)
这是您的扩展方法。如果您正在对控制器进行依赖注入(非参数构造函数),则需要使用反射枚举控制器构造函数,或者使用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;
}
}
答案 1 :(得分:2)
尝试回顾性地解决它是一种蠕虫,因为您可能需要使用反射来发现正确的方法 - 将所需数据插入HttpContext.Items
可能更简单作为授权失败的代码的一部分?然后,您可以通过RequestContext.HttpContext.Items
处理方法获取它。
答案 2 :(得分:0)
我已经回答了我自己的问题,这与此非常相似。
如果您仍然感兴趣,也许我可以深入了解它。
我的问题不是从您的URL开始,而是从控制器和操作名称开始,还有http方法(GET,POST ...)。