我编写了一个自定义委托处理程序,它将自定义标头添加到响应中并在请求中检查。
我在 WebAPI 配置中添加了句柄
config.MessageHandlers.Add(new customHandler());
但这个问题适用于所有控制器。我需要应用特定于控制器的自定义标头。是否可以添加特定于控制器的自定义处理程序?
我编写了一个自定义委托处理程序,它将自定义标头添加到响应中并在请求中检查。
我在 WebAPI 配置中添加了句柄
config.MessageHandlers.Add(new customHandler());
但这个问题适用于所有控制器。我需要应用特定于控制器的自定义标头。是否可以添加特定于控制器的自定义处理程序?
在本文末尾,它解释了如何仅将处理程序应用于某些路由:http ://www.asp.net/web-api/overview/working-with-http/http-message-handlers 。您可能必须为您的控制器创建一个唯一的处理程序,以便它仅适用于该控制器。
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());
);
关于每个路由消息处理程序的管道是什么样的,您可以查看此处。
您可以做的是使用每个路由消息处理程序,但在这里要小心。作为@Nick 在他的回答中链接的文章,您可以链接处理程序并确保HttpControllerDispatcher
涉及。否则,您将无法进入 Controller 管道。
我喜欢的另一种选择是将HttpControllerDispatcher
用作自定义处理程序的基类:
public class CustomerOrdersDispatcher : HttpControllerDispatcher {
public CustomerOrdersDispatcher(HttpConfiguration config)
: base(config) {
}
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken) {
// Do some stuff here...
return base.SendAsync(request, cancellationToken);
}
}
在这里,您将如何注册它:
protected void Application_Start(object sender, EventArgs e) {
var config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute(
name: "CustomerOrdersHttpRoute",
routeTemplate: "api/customers/{customerKey}/orders/{key}",
defaults: new { controller = "CustomerOrders", key = RouteParameter.Optional },
constraints: null,
handler: new CustomerOrdersDispatcher(config)
);
config.MessageHandlers.Add(new SomeOtherHandler1());
config.MessageHandlers.Add(new SomeOtherHandler2());
}
在SomeOtherHandler1
和SomeOtherHandler2
被执行之后,您CustomerOrdersDispatcher
将被执行为CustomerOrdersHttpRoute路由。因此,您可以看到您保留了默认处理程序行为并设置了一些全局处理程序,同时您也有一个特定于路由的处理程序。
这是我的完整实现CustomerOrdersDispatcher
:https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs。
您也可以查看完整的示例应用程序源代码以了解其工作原理:https ://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample