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

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操作将被调用。


这篇文章使用MapHttpRoute实现了相同的功能。但是这并不适用于Attribute Routing - Nameless
2个回答

2

很不幸,你不能通过 AttributeRouting 设置任何处理程序。如果你想要为特定路由分配处理程序,你必须仅通过 MapHttpRoute 注册它。除非你需要在 defaults 部分中添加你的控制器名称,就像 Ajay Aradhya 的回答中那样,并从你的操作中删除 Route 属性,因为你只能使用 Route 属性或 MapHttpRoute 方法注册路由,但不能同时使用两者。

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


-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());
);

谢谢你的留言,但是我使用路由属性,所以我永远不会进入这个新创建的路由(路由属性的优先级高于常规路由)。 - Florin-Constantin Ciubotariu
好的,我会查看一下。如果我发现了什么,我会告诉你的。 - Nameless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接