我有一个 HttpModule 在执行 web api 控制器的操作之前对请求进行一些处理。我希望能够确定请求将执行哪些控制器/动作,以便我可以提前检查可能在控制器/动作上设置的一些属性。如何发现特定请求 URI 将调用的控制器/操作?
在 HttpModule 中,显然我可以从 RouteTable 中获取 RouteData——我如何使用它来找出将被调用的控制器和操作的类型(或者最好是方法信息,或者至少是方法名称)?
我有一个 HttpModule 在执行 web api 控制器的操作之前对请求进行一些处理。我希望能够确定请求将执行哪些控制器/动作,以便我可以提前检查可能在控制器/动作上设置的一些属性。如何发现特定请求 URI 将调用的控制器/操作?
在 HttpModule 中,显然我可以从 RouteTable 中获取 RouteData——我如何使用它来找出将被调用的控制器和操作的类型(或者最好是方法信息,或者至少是方法名称)?
这是一个示例,说明如何获取ActionDescriptor
和ControllerDescriptor
来自RouteData
:
var routeData = RouteTable.Routes.GetRouteData(requestContext.HttpContext);
if (routeData == null)
return false;
var controllerName = (string)routeData.Values["controller"];
var actionName = (string) routeData.Values["action"];
var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(requestContext, controllerName);
if (controller == null)
return false;
var controllerType = controller.GetType();
var controllerDescriptor = new ReflectedControllerDescriptor(controllerType);
var actionDescriptors = controllerDescriptor.GetCanonicalActions();
HttpModule 不是你应该做这些事情的地方。无论请求是否进入 ASP.NET Web API 管道,都会为每个请求执行一个 HttpModule。
您需要的是一个消息处理程序,它将像 HttpModule 一样用于 ASP.NET Web API 请求。