只能为使用路由属性的特定控制器添加messageHandler?
如果不包含某些标头,我想在管道中较早地剪切请求。我想要 提到:
-
我无法在Webapiconfig中添加其他路由,我们必须使用控制器中的路由属性。
-
我不想在全球添加MessageHandler。
-
它必须是一个消息手(在管道的早期)。我们还有其他选择,但我们正在尝试更有效地做到这一点。
例如,我已经使用以下RoutePrefix:API/Myapicontroller和路由(")装饰了控制器。(我知道这很奇怪,我们正在基于Querystring选择其他动作)
然后,我添加了
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中的操作被称为。
不幸的是,您无法通过AttributeRouting
设置任何处理程序。如果要将处理程序分配给特定路由,则必须仅通过MapHttpRoute
进行注册。除了您需要在defaults
部分中添加控制器名称,例如Ajay Aradhya的答案中并从操作中删除Route
属性,因为允许您使用Route
属性或MapHttpRoute
方法注册路由,但并非同时进行。
还请注意,您需要创建管道,否则您的处理程序将工作,但请求不会达到控制器操作。有关详细信息,请参见我在类似问题上的答案。
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());
);