2

我有一个需要使用 2 个委托处理程序的 Web API 调用,但我似乎从未进入第二个处理程序。该路线已向处理程序注册。我不允许在全局配置中设置处理程序。

 DelegatingHandler[] handlers = new DelegatingHandler[2];
        handlers[0] = new HandlerA();
        handlers[1] = new HandlerB();

        RouteTable.Routes.MapHttpRoute(
            name: "TestAPI",
            routeTemplate: "api/{controller}",
            handler: HttpClientFactory.CreatePipeline(
                innerHandler: new HttpClientHandler(),
                handlers: handlers
            ),
            defaults: new { controller = "test"},
            constraints: null
        );

HandlerA 触发断点,没有进一步的问题。

 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) {
        if (request == null)
            throw new ArgumentNullException("request");

        //Breakpoint is hit
        return base.SendAsync(request, cancellationToken);
    }

我预计会到达 HandlerB 但它永远不会到达,它直接进入 API 控制器。处理程序 A 不对请求做任何事情。

4

1 回答 1

1

我在这篇博文中找到了我的问题的答案:http: //byterot.blogspot.nl/2012/05/aspnet-web-api-series-messagehandler.html

第一个处理程序没有为 API 路由提供处理程序数组,而是将第二个处理程序设置为内部处理程序。

DelegatingHandler[] handlers = new DelegatingHandler[2];
handlers[0] = new HandlerA();
handlers[1] = new HandlerB();
handlers[0].InnerHandler = handlers[1];

RouteTable.Routes.MapHttpRoute(
        name: "TestAPI",
        routeTemplate: "api/{controller}",
        handler: handlers[0],
        defaults: new { controller = "test"},
        constraints: null
    );
于 2016-06-06T15:32:13.603 回答