我正在使用 OWIN TestServer,它为我提供了一个 HttpClient 来对测试服务器进行内存调用。我想知道是否有一种方法可以传入现有的 HttpClient 供 Flurl 使用。
问问题
479 次
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 回答