這兒有你的擴展方法。如果您在控制器上進行依賴注入(非參數構造函數),則需要使用反射來枚舉控制器構造函數,或使用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'的生命週期是每個請求。存儲在Items Hashtable中的任何信息都會在請求執行後消失。 – Leigh