向 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”

无法通过 HTTPClient 向 REST 发送 post 请求

TestServer 返回 404 未找到

客户端怎么使用httpclient向https服务器发送数据