可以仅为使用路由属性的特定控制器添加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动作。
答案 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());
);