我正在使用OWIN TestServer,它为我提供了一个HttpClient来对测试服务器进行内存调用。我想知道是否可以通过现有的HttpClient传递Flurl。
答案 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(...);
}
}