向 TestServer 的 HttpClient 添加一个委托处理程序(传出请求中间件)
Posted
技术标签:
【中文标题】向 TestServer 的 HttpClient 添加一个委托处理程序(传出请求中间件)【英文标题】:Add an DelegationHandler (outgoing request middleware) to TestServer's HttpClient 【发布时间】:2019-08-04 11:58:11 【问题描述】:是否可以在asp.net核心TestServer
构建的HttpClient
中添加自定义DelegationHandler
(传出请求中间件)?
我正在尝试将使用HttpClientFactory
影响HttpClients
的customization possibilities 与内存测试实用程序TestServer
结合起来:
public class ExternalProxySslDowngradeSimulator : DelegatingHandler
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken token)
if (request.RequestUri.Scheme == "https")
request.RequestUri = new Uri(
request.RequestUri.OriginalString.Replace("https:", "http:"));
return base.SendAsync(request, token);
[TestFixture
public class TestClass
[Test]
public async Task CallApi()
var builder = new WebHostBuilder()
.ConfigureAppConfiguration((ctx, config) => )
.UseUrl("http://customDomain.com")
.UseStartup<CustomApi.Startup>();
var testServer = new Microsoft.AspNetCore.TestHost.TestServer(builder);
var httpClient = testServer.CreateClient();
var apiResult = await httpClient.GetAsync("https://customDomain");
我找不到将我的DelegatingHandler
插入从testServer.CreateClient()
返回的HttpClient
的方法
到目前为止我已经尝试过:
-
Registering a custom HttpClientBuilder(没用):
// did not work:
var builder = new WebHostBuilder()
.UseStartup<CustomApi.Startup>()
.ConfigureServices(services =>
services
.AddHttpClient("")
.AddHttpMessageHandler<ExternalProxySslDowngradeSimulator>();
查看code for TestServer
它并没有挂接到该管道。
-
自定义
HttpClientFactoryOptions
(无效)
我想我可以绑定一个自定义HttpClientFactoryOptions
并向HttpClientFactoryOptions.HttpMessageHandlerBuilderActions
添加一个自定义操作。但是 TestServer 并没有像默认的 Http Client Factory 那样真正使用它。
-
自定义
TestServer
的设置(无效)
查看文档/源代码没有看到任何可以挂钩的地方。有一个 extension method to further control DI,但我没有看到如何让我挂钩到 TestServer 正在使用的自定义 HttpMessangeHandler
。
【问题讨论】:
【参考方案1】:所以你要做的是使用测试服务器(代码示例中的服务器)的 CreateHandler 方法和 HttpClientFactory.Create 方法创建自己的客户端。
var client = HttpClientFactory.Create(Server.CreateHandler(), new CustomDelegate() );
client.BaseAddress = Server.BaseAddress;
我花了很长时间才弄明白。希望这对您有所帮助。
所以你的例子是
var httpClient = HttpClientFactory.Create(testServer.CreateHander(), new ExternalProxySslDowngradeSimulator());
httpClient.BaseAddress = testServer.BaseAddress;
【讨论】:
有趣。我放弃了解决这个问题并继续前进。我必须追踪我的旧项目,看看这是否解决了它!以上是关于向 TestServer 的 HttpClient 添加一个委托处理程序(传出请求中间件)的主要内容,如果未能解决你的问题,请参考以下文章
Django 无效的 HTTP_HOST 标头:'testserver'。您可能需要将 u'testserver' 添加到 ALLOWED_HOSTS
9.12 Binder系统_Java实现_内部机制_Client端
HttpClient 向 Nginx 服务器投诉“NoHttpResponseException”