首页 > 解决方案 > 向 TestServer 的 HttpClient 添加一个委托处理程序(传出请求中间件)

问题描述

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

我正在尝试将用于影响的自定义可能性与内存测试实用程序结合起来:HttpClientFactoryHttpClientsTestServer

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()


到目前为止我已经尝试过:

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

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

  1. 自定义HttpClientFactoryOptions(无效)

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

  1. 自定义设置TestServer(不起作用)

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

标签: c#testingasp.net-core.net-coredotnet-httpclient

解决方案


因此,您要做的是使用测试服务器(代码示例中的服务器)的 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;

推荐阅读