【问题标题】:Get an Asp.net Web API controller context or action context in an HttpModule在 HttpModule 中获取 Asp.net Web API 控制器上下文或操作上下文
【发布时间】:2012-08-26 11:17:14
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您需要的是一个Message Handler,它与 ASP.NET Web API 请求的 HttpModule 类似。

    【讨论】:

    • 是的,我研究得越多,如果我想使用控制器/动作描述中的任何上下文信息,我就越觉得这是我必须采取的路线。我希望在 httpmodule 级别做尽可能多的事情,以便在不需要时将任何调用短路到基于 WebAPI 的东西中(也就是说,调用者没有经过身份验证)。
    【解决方案2】:

    这是一个示例,说明如何从RouteData 获取ActionDescriptorControllerDescriptor

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

    【讨论】:

    • ControllerBuilder 在 Web API 中有模拟吗?
    • ApiController 是控制器 afaik。
    • 是的,我的意思是“ControllerBuilder”类型——它似乎在 System.Web.Mvc 中,但我在 System.Web.Http 中没有看到类似的东西。
    • 这是完全错误的。 ASP.NET Web API 与 ASP.NET MVC(换句话说,System.Web.Mvc)无关。
    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 2013-04-24
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多