是否可以将Furl.Http与OWIN TestServer一起使用?

时间:2015-10-12 21:26:03

标签: owin dotnet-httpclient flurl

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

1 个答案:

答案 0 :(得分:2)

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

var flurlClient = new FlurlClient(httpClient);

Flurl提供了一个IHttpClientFactory界面,允许您自定义HttpClient构造。但是,Flurl的大部分功能都是由自定义HttpMessageHandler提供的,在构建时添加到HttpClient。您不希望将热插拔用于已经实例化的HttpClient,否则您将面临破坏Flurl的风险。

幸运的是,OWIN TestServer也由HttpMessageHandler驱动,您可以在创建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实例上设置new capability实例截至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(...);
    }
}