向TestServer的HttpClient添加一个DelegationHandler(传出请求中间件)

Phi*_*tle 6 c# testing dotnet-httpclient .net-core asp.net-core

是否可以向由 asp.net 核心构建的添加自定义DelegationHandler(传出请求中间件)?HttpClientTestServer

我试图在联合定制的可能使用的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");
   }
}
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法将我的DelegatingHandler插入从HttpClient返回testServer.CreateClient()


到目前为止我尝试过的:

  1. 注册自定义 HttpClientBuilder(不起作用):
// did not work:
var builder = new WebHostBuilder()
   .UseStartup<CustomApi.Startup>()
   .ConfigureServices(services =>
   {
        services
          .AddHttpClient("")
          .AddHttpMessageHandler<ExternalProxySslDowngradeSimulator>();
Run Code Online (Sandbox Code Playgroud)

查看TestServer它的代码并没有连接到该管道中。

  1. 自定义HttpClientFactoryOptions(不起作用)

以为我可以绑定自定义HttpClientFactoryOptions并将自定义操作添加到HttpClientFactoryOptions.HttpMessageHandlerBuilderActions. 但是 TestServer 并没有像默认的 Http Client Factory 那样真正使用它。

  1. 自定义设置TestServer(无效)

查看文档/源代码没有看到任何地方可以挂钩。有一个扩展方法可以进一步控制 DI,但我没有看到如何让我挂钩到HttpMessangeHandlerTestServer 正在使用的自定义中。

dko*_*dko 1

因此,您要做的就是使用测试服务器(代码示例中的服务器)的 CreateHandler 方法和 HttpClientFactory.Create 方法创建自己的客户端。

var client = HttpClientFactory.Create(Server.CreateHandler(), new CustomDelegate() );
client.BaseAddress = Server.BaseAddress;
Run Code Online (Sandbox Code Playgroud)

这花了我很长时间才弄清楚。希望这对您有帮助。

所以你的例子是

var httpClient = HttpClientFactory.Create(testServer.CreateHander(), new ExternalProxySslDowngradeSimulator());
httpClient.BaseAddress = testServer.BaseAddress;
Run Code Online (Sandbox Code Playgroud)