8

是否可以仅为使用路由属性的特定控制器添加 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 操作会被调用。

4

2 回答 2

2

不幸的是,您不能通过AttributeRouting. 如果您想将处理程序分配给特定路由,您必须MapHttpRoute仅通过注册它。除了您需要defaults在 Ajay Aradhya 的回答中添加控制器名称并Route从您的操作中删除属性,因为您可以使用Route属性或MapHttpRoute方法注册路由,但不能同时注册。

另请注意,您需要创建管道,否则您的处理程序将工作但请求不会命中控制器操作。有关详细信息,请参阅对类似问题的回答。

于 2018-02-01T15:10:28.577 回答
-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());
);
于 2017-03-14T11:33:42.510 回答