1

我正在使用 OWIN TestServer,它为我提供了一个 HttpClient 来对测试服务器进行内存调用。我想知道是否有一种方法可以传入现有的 HttpClient 供 Flurl 使用。

4

1 回答 1

2

更新:下面的大部分信息在 Flurl.Http 2.x 中不再相关。具体来说,Flurl 的大部分功能都包含在新FlurlClient对象(包装HttpClient)中,而不是自定义消息处理程序中,因此如果您提供不同的HttpClient. 此外,从 Flurl.Http 2.3.1 开始,您不再需要自定义工厂来执行此操作。这很简单:

var flurlClient = new FlurlClient(httpClient);

Flurl 提供了一个IHttpClientFactory接口,允许您自定义HttpClient构造。然而,Flurl 的大部分功能是由一个 custom 提供的HttpMessageHandler,它是HttpClient在构造时添加的。您不想将其热交换为已经实例化的HttpClient,否则您将冒着破坏 Flurl 的风险。

HttpMessageHandler幸运的是, OWIN TestServer 也是由HttpClient.

从允许您传入TestServer实例的自定义工厂开始:

using Flurl.Http.Configuration;
using Microsoft.Owin.Testing;

public class OwinTestHttpClientFactory : DefaultHttpClientFactory
{
    private readonly TestServer _testServer;

    public OwinTestHttpClientFactory(TestServer server) {
        _testServer = server;
    }

    public override HttpMessageHandler CreateMessageHandler() {
        // TestServer's HttpMessageHandler will be added to the end of the pipeline
        return _testServer.Handler;
    }
}

工厂可以在全局范围内注册,但由于TestServer每次测试都需要不同的实例,我建议在FlurlClient实例上设置它,这是Flurl.Http 0.7的新功能。所以你的测试看起来像这样:

using (var testServer = TestServer.Create(...)) {
    using (var flurlClient = new FlurlClient()) {
        flurlClient.Settings.HttpClientFactory = new OwinTestHttpClientFactory(testServer);

        // do your tests with the FlurlClient instance. 2 ways to do that:
        url.WithClient(flurlClient).PostJsonAsync(...);
        flurlClient.WithUrl(url).PostJsonAsync(...);
    }
}
于 2015-10-14T14:55:16.067 回答