.NET Core: HttpClientFactory: 如何在没有依赖注入的情况下配置 ConfigurePrimaryHttpMessageHandler?

3
我有一个.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
        };
    });


我想在我的示例代码#1中添加HttpClientHandler,而不使用依赖注入。 如何在没有依赖注入的情况下配置主要的消息处理程序?

你的意思是不使用AddHttpClient吗? - Neville Nazerane
你可以通过使用 services.BuildServiceProvider().GetService<HttpClient>()services 中获取 HttpClient - Neville Nazerane
能够获取HttpClient。 我想添加自定义的消息处理程序。 - randy107
您是指不希望将 Microsoft.DependencyInjection.Extensions NuGet 包含在您的库中吗? - Neville Nazerane
@NevilleNazerane库可以包含DI扩展。但我不想通过DI容器注入依赖项。这个帖子中的答案解决了我的问题。 - randy107
显示剩余5条评论
1个回答

6

我认为你的设置很奇怪,但除此之外,你可能可以像这样做:

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将导致重新设计。因此,我只有一个使用HttpClientFactory而不使用DI的用例。 - randy107

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接