gpt4 book ai didi

c# - 注入(inject)的 HttpClient 会忽略 IHttpClientFactory 配置

转载 作者:行者123 更新时间:2023-12-04 04:01:04 25 4
gpt4 key购买 nike

我创建了一个自定义库,它自动为依赖于 HttpClient 的特定服务设置 Polly 策略。 .
这是使用 IServiceCollection 完成的。扩展方法和类型化客户端方法。一个简化的例子:

public static IHttpClientBuilder SetUpFooServiceHttpClient(this IServiceCollection services)
{
return services
.AddHttpClient<FooService>()
.AddPolicyHandler(GetRetryPolicy());
}
示例服务:
public class FooService
{
private readonly HttpClient _client;

// OPTION 1
public FooService(HttpClient httpClient)
{
_client = httpClient;
}

// OPTION 2
public FooService(IHttpClientFactory httpClientFactory)
{
_client = httpClientFactory.CreateClient(GetType().Name);
}

public void DoJob()
{
var test = _client.GetAsync("http://example.com");
}
}
从 DI 容器中获取服务(来自测试项目):
var services = new ServiceCollection();

services.SetUpFooServiceHttpClient();

services.AddSingleton<FooService>();

var fooService = services
.BuildServiceProvider()
.GetRequiredService<FooService>();

// Perform test
fooService.DoJob();
注意:在这个测试项目中,我还添加了一个额外的模拟处理程序,因为我试图模拟 http 状态响应,但是模拟处理程序是否存在与 Polly 策略是否存在相同,所以我省略了模拟处理程序从示例代码。
注意 FooService 中的两个不同的构造函数.根据我注释掉哪一个以及留下哪一个,我会得到不同的结果。所有其他代码保持不变。
  • 选项 1,注入(inject) HttpClient直接,忽略我所有的配置。我得到了一个没有 Polly 策略处理程序的标准 http 客户端。
  • 选项 2,注入(inject) IHttpClientFactory并使用当前类型名称(即 FooService )请求客户端尊重我的配置。我得到了一个自定义 http 客户端,其中包含 Polly 策略处理程序(以及我可能配置的任何其他处理程序,例如我的测试套件中的模拟处理程序)

  • 在这两种情况下都使用调试检查来确认策略处理程序的缺失/存在。
    根据我在该主题上找到的所有文档,这两个选项应该是等效的,至少在构造的 HttpClient 方面是等效的。我最终得到的。但这里不是这样。
    我找到的文档指定 HttpClient使用时可以注入(inject) 输入 客户:
  • MSDN documentation ,特别是“类型化客户端”部分示例。
  • 这个SO answer
  • 这个blog post

  • 我正在使用类型化客户端,但注入(inject)了 HttpClient显然对我不起作用。
    为什么注入(inject) HttpClient与注入(inject) IHttpClientFactory在我的情况下工作方式不同?

    最佳答案

    实际上,您的 FooService 有以下两个注册。类(class):

  • services.AddHttpClient<FooService>()
  • services.AddSingleton<FooService>();

  • 由于 DI 容器在幕后的工作方式,第二个注册会覆盖第一个。如果您删除第二个注册,将使用第一个注册,因此您的构造函数将使用 HttpClient参数将被调用。

    关于c# - 注入(inject)的 HttpClient 会忽略 IHttpClientFactory 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63056470/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com