是否可以添加自定义 DelegationHandler
(传出请求中间件)到 HttpClient
由 asp.net 核心 TestServer
构建?
我正在尝试合并 customization possibilities使用 HttpClientFactory
影响HttpClients
使用内存测试实用程序 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
的方法进入HttpClient
从 testServer.CreateClient()
返回到目前为止我已经尝试过:
// did not work:
var builder = new WebHostBuilder()
.UseStartup<CustomApi.Startup>()
.ConfigureServices(services =>
{
services
.AddHttpClient("")
.AddHttpMessageHandler<ExternalProxySslDowngradeSimulator>();
浏览 code for
TestServer
它没有与该管道 Hook 。HttpClientFactoryOptions
(没用)以为我可以绑定(bind)自定义
HttpClientFactoryOptions
并将自定义操作添加到 HttpClientFactoryOptions.HttpMessageHandlerBuilderActions
.但是 TestServer 并没有像默认的 Http Client Factory 那样真正使用它。TestServer
(没用)浏览文档/源代码没有看到任何地方可以 Hook 。有一个 extension method to further control DI ,但我不明白这怎么能让我进入自定义
HttpMessangeHandler
TestServer 正在使用。
最佳答案
因此,您要做的是使用测试服务器(代码示例中的服务器)的 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;
关于c# - 向 TestServer 的 HttpClient 添加一个委托(delegate)处理程序(传出请求中间件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57346361/