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



只能为使用路由属性的特定控制器添加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());
);

相关内容

  • 没有找到相关文章

最新更新