我刚刚添加了使用 HttpClients 的新推荐方式,即使用与 Polly 集成的 HttpClientFactory
这是我的 DI
services.AddHttpClient("ThirdParty", client =>
{
//commented out for the purpose of this question
//client.Timeout =
// TimeSpan.FromSeconds(configProvider.OverallTimeout);
});
这是服务提供商代码
using (var client = _clientFactory.CreateClient("ThirdParty"))
{
....
//write log for start time
var response = await client.PostAsync(url, content);
//write log for end time
....
}
现在,上面的服务提供者代码在一个被多次调用的类中,比如对进入服务的每个请求调用 6 次
我运行的示例测试是向服务发出一个请求,该服务又调用服务提供者类 6 次,向第三方发出 6 个单独的请求以检索响应。
我还将第三方设置为延迟 5 秒,因此我期望发生的是同时触发所有 6 个请求,并且所有响应在 5 秒后返回,因为客户端工厂应该创建 http 客户端暂时的
然而,我发现请求似乎在它们的响应时间上配对,即前两个需要 5 秒,后两个需要 10 秒,最后两个需要 15 秒,即使它们实际上都被解雇了完全相同的时间
如果我将代码更改为
使用 (var client = _clientFactory.CreateClient("randomString"))... (所以它没有引用 DI 中的“第三方”自定义配置,(即使它本身还没有做任何事情))
它工作正常,所有响应在 5 秒后返回。
另外,如果我将代码更改为以前的代码
使用 (var client = new HttpClient())...
这也按预期工作,所有响应在 5 秒后返回
因此,它似乎与为 DI 进行自定义设置有关。
有任何想法吗?
我也尝试过使用 TypedClients 而不是上面的 NamedClients 方法,我得到了相同的结果
更新
仅当托管在服务结构应用程序中时才会出现此问题