繁体   English   中英

ASP.NET Web API中特定于Controller的自定义委派处理程序

[英]Custom Delegating Handler specific to a Controller in ASP.NET Web API

我编写了一个自定义委派处理程序,它将自定义标题添加到响应并检查请求。

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

关于每个路由消息处理程序的管道如何,您可以在这里查看

你可以做的是使用per-route消息处理程序,但在这里要小心。 正如@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());
}

之后SomeOtherHandler1SomeOtherHandler2执行,你CustomerOrdersDispatcher将为CustomerOrdersHttpRoute路线执行。 因此,您可以看到保留默认处理程序行为并设置一些全局处理程序,同时具有特定于路径的处理程序。

以下是我的CustomerOrdersDispatcher的完整实现: https//github.com/tugberkugurlu/AdvancedWebAPI/blob/master/PerRouteMHOwnershipSample/Dispatcher/CustomerOrdersDispatcher.cs

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM