自定义委派处理器专用于的ASP.NET Web API一个控制器(Custom Delegating

2019-08-03 08:00发布

我写了一个自定义委派其处理程序添加自定义的报文头中请求的响应和检查。

我添加了手柄中的WebAPI配置

config.MessageHandlers.Add(new customHandler());

但问题是适用于所有的控制器。 我需要应用特定的控制器自定义标题。 是否可以添加特定的控制器自定义处理程序?

Answer 1:

在这篇文章的末尾解释了如何处理程序只适用于某些航线: 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());
    );

关于如何每个路由消息处理程序的管道会是什么样子,你可以看看这里



Answer 2:

你可以做的是使用每个路由消息处理程序,但这里要小心。 作为@Nick在他的回答链接的文章,你可以链中的处理程序,并确保HttpControllerDispatcher参与。 否则,你就不会进入控制器管道。

我喜欢另外一个选择是使用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());
}

之后SomeOtherHandler1SomeOtherHandler2执行,你CustomerOrdersDispatcher将为CustomerOrdersHttpRoute路线执行。 所以,你可以看到你保存的默认处理程序行为,并设置一些全局处理程序,而你有一个特定的路线之一,也是。

这是全面落实我的CustomerOrdersDispatcher : https://github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs 。

您可以查看完整的示例应用程序的源代码,以及看看它是如何工作: https://github.com/tugberkugurlu/AdvancedWebAPI/tree/master/PerRouteMHOwnershipSample



文章来源: Custom Delegating Handler specific to a Controller in ASP.NET Web API