【问题标题】:.NET Core: HttpClientFactory: How to configure ConfigurePrimaryHttpMessageHandler without dependency injection?.NET Core:HttpClientFactory:如何在没有依赖注入的情况下配置 ConfigurePrimaryHttpMessageHandler?
【发布时间】:2020-09-14 06:25:04
【问题描述】:

我有一个 .NET Core 类库。正在使用 IHttpClientFactory 创建 HttpClient 实例而无需依赖注入。我在我的类库中包含了 Microsoft DI nuget 包。

示例代码 #1:

Class A {

private readonly HttpClient client;

 public A(){
            var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();
            var _httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
            client = _httpClientFactory.CreateClient();  //HttpClient instance created
            //TODO: Add custom message handler without DI.
  }
}

使用 DI,我们可以配置自定义消息处理程序: 带 DI 的示例代码 #2:

services.AddHttpClient()
        .ConfigurePrimaryHttpMessageHandler(() =>
        {
            return new HttpClientHandler
            {
                ServerCertificateCustomValidationCallback = (m, crt, chn, e) => true
            };
        });

我想在没有 DI 的情况下将 HttpClientHandler 添加到我的示例代码 #1。 如何在没有 DI 的情况下配置主消息处理程序?

【问题讨论】:

  • 你的意思是不使用AddHttpClient?
  • 你总是可以使用services.BuildServiceProvider().GetService&lt;HttpClient&gt;()services中获取HttpClient
  • 能够获取 HttpClient。我想添加自定义消息处理程序。
  • 如果您使用上述函数,您的消息处理程序将在其中。您还可以使用AddHttpMessageHandler 添加其他消息处理程序
  • 很好的例子。在您的示例中,“服务”变量的类型为 IServiceCollection,它来自 DI 容器。我想在没有 DI 容器的类库中添加处理程序

标签: c# asp.net-core .net-core dependency-injection httpclient


【解决方案1】:

我认为您的设置很奇怪,但除此之外,您还可以执行以下操作:

private readonly HttpClient client;

public A() {
    var serviceProvider = new ServiceCollection()
        .AddHttpClient("YourHttpClientName")
        .Configure<HttpClientFactoryOptions>("YourHttpClientName", options =>
            options.HttpMessageHandlerBuilderActions.Add(builder =>
                builder.PrimaryHandler = new HttpClientHandler
                {
                    ServerCertificateCustomValidationCallback = (m, crt, chn, e) => true
                }))
        .BuildServiceProvider();
    var _httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
    client = _httpClientFactory.CreateClient();  //HttpClient instance created
    //TODO: Add custom message handler without DI.
}

我刚刚检查了ConfigurePrimaryHttpMessageHandler 的实现并将其链接到您的设置中。


我的建议是更改您的代码并正确使用 DI,因为 .NET Core 严重依赖于此。

【讨论】:

  • 这很酷。感谢您的解决方案。当然 .NET Core 服务依赖于 DI,在我当前的场景中,DI 会导致重新设计。所以我只有一个使用没有 DI 的 HttpClientFactory 的用例。
猜你喜欢
  • 1970-01-01
  • 2020-12-08
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多