在HttpModule中获取Asp.net Web API控制器上下文或操作上下文

时间:2012-08-31 15:47:59

标签: asp.net asp.net-mvc routing asp.net-web-api

我有一个HttpModule在执行web api控制器操作之前对请求进行一些处理。我希望能够确定请求将执行哪些控制器/操作,以便我可以检查可能在控制器/操作上提前设置的一些属性。如何发现特定请求URI将调用的控制器/操作?

在HttpModule中,显然我可以从RouteTable获取RouteData - 我如何使用它来找出控制器的类型(或者最好是methodinfo,或者至少是方法名称)。将被调用的行动?

2 个答案:

答案 0 :(得分:1)

以下是说明如何从ActionDescriptor获取ControllerDescriptorRouteData的示例:

    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(); 

答案 1 :(得分:1)

HttpModule不是你应该做这些事情的地方。无论请求是否进入ASP.NET Web API管道,都将为每个请求执行HttpModule。

这里需要的是Message Handler,它将作为ASP.NET Web API请求的HttpModule实现。