如何为ASP.NET WebAPI 2中使用路由属性的特定控制器添加MessageHandler?

时间:2017-03-09 18:53:22

标签: asp.net asp.net-web-api asp.net-web-api2 message-handlers routeattribute

可以仅为使用路由属性的特定控制器添加MessageHandler吗?

如果请求不包含某些标头,我想在管道中提前删除它。我想要    提到:

  • 我无法在WebApiConfig中添加其他路由,我们必须使用控制器中的路由属性。

  • 我不想全局添加MessageHandler。

  • 它必须是MessageHandler(在管道的早期)。我们有替代方案,但我们正在努力提高效率。

例如,我用以下RoutePrefix修饰了控制器:api / myapicontroller和一个带有Route(“”)的动作。 (我知道这很奇怪,我们正在根据查询字符串选择不同的动作)

然后,我添加了

config.Routes.MapHttpRoute(
        name: "CustomRoute",
        routeTemplate: "api/myapicontroller/{id}",
        defaults: new { id = RouteParameter.Optional },
        constraints: null,
        handler: new myMessageHandler()  
    );    

如果我将此代码放在config.MapHttpAttributeRoutes();之前myMessageHandler正在执行但是我收到此消息:

  

在匹配的控制器'myapicontroller'上未找到任何操作   请求

如果我先放config.MapHttpAttributeRoutes();,myMessageHandler永远不会被执行,但调用myapicontroller中的my动作。

2 个答案:

答案 0 :(得分:2)

很遗憾,您无法通过AttributeRouting设置任何处理程序。如果要将处理程序分配给特定路由,则必须仅通过MapHttpRoute进行注册。除非您需要在defaults部分添加控制器名称,例如Ajay Aradhya的答案,并从您的操作中删除Route属性,因为您可以使用Route属性或{{注册路径1}}方法,但不能同时使用两种方法。

另请注意,您需要创建管道,否则您的处理程序将起作用,但请求不会触及控制器操作。 有关详细信息,请参阅类似问题的my answer

答案 1 :(得分:-1)

MS docs的这篇文章解释了相同的内容。最后,它们提供了一种具有控制器特定处理程序的方法。但这是传统路由的方法。我不知道这对你有帮助。

config.Routes.MapHttpRoute(
    name: "MyCustomHandlerRoute",
    routeTemplate: "api/MyController/{id}",
    defaults: new { controller = "MyController", id = RouteParameter.Optional },
    constraints: null,
    handler: HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), new MyCustomDelegatingMessageHandlerA());
);