我有一个控制器和动作,这是负责处理403S由于用户在正确的角色不是。 它有访问原始RequestContext
导致异常。
我希望能够做的是装饰我的行动与他们所做的事情,然后让用户通知他们的经理,请求访问包含在电子邮件中描述的说明。
所以, 我怎么能制定出什么样的行动将被称为给出RequestContext
?
显然,这是更复杂,越来越控制器和动作名称出的RouteData
因为有经常的操作方法等重载
一旦我有MethodInfo
那么容易得到的属性等。
我有一个控制器和动作,这是负责处理403S由于用户在正确的角色不是。 它有访问原始RequestContext
导致异常。
我希望能够做的是装饰我的行动与他们所做的事情,然后让用户通知他们的经理,请求访问包含在电子邮件中描述的说明。
所以, 我怎么能制定出什么样的行动将被称为给出RequestContext
?
显然,这是更复杂,越来越控制器和动作名称出的RouteData
因为有经常的操作方法等重载
一旦我有MethodInfo
那么容易得到的属性等。
试图解决它回顾是有点忌讳的,因为你可能需要使用反射来发现正确的方法-它可能是简单的插入所需的数据到HttpContext.Items
作为代码的一部分其中授权失败? 然后,将可通过您的处理方法RequestContext.HttpContext.Items
。
下面是你的扩展方法。 如果你做你的控制器(无参数的构造函数)的依赖注入,则需要使用反射来枚举控制器构造函数,或使用您的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;
}
}
我已经回答了我的问题,这是非常类似于此。
如果这是你的兴趣还在,也许我可以去钻研它。
我的问题并没有从URL作为你的开始,而是从控制器和动作的名称,也是HTTP方法(GET,POST ...)。