使用来自.NET 4.6.2的HttpClientFactory

48
我有一个.NET 4.6.2控制台应用程序(使用Simple Injector)。我需要调用HTTP服务。由于直接使用HttpClient遇到问题,因此我尝试使用HttpClientFactory(https://github.com/aspnet/HttpClientFactory)。
该项目/库是.NET Standard 2.0,因此应该可以在.NET 4.6.2中使用,但它使用像IServiceCollection这样只存在于Core中的东西。
所以我的问题是,我能否在非Core应用程序中使用HttpClientFactory。

1
IServiceCollection 不仅仅是核心。 - Nkosi
https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.iservicecollection?view=aspnetcore-2.1 表示支持 ASP.NET Core 2.1、2.0、1.1 和 1.0。 - Test45
1
看一下Nuget包,你会看到https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection/2.1.1。 - Nkosi
2个回答

57

所有的Microsoft.Extensions.*包都是针对.NET Standard 2.0开发的。这意味着,如果您将适当的包添加到应用程序中,就可以使用依赖注入(Dependency Injection)、配置(Configuration)、日志(Logging)和HttpClientFactory。

要使用HttpClientFactory,您需要添加Microsoft.Extensions.Http,如果您想与Polly一起使用它,则需要添加Microsoft.Extensions.Http.Polly

要配置HttpClientFactory,您需要将Microsoft.Extensions.DependencyInjection添加到您的“主”项目中。Microsoft.Extensions.Http包仅依赖于包含接口而不是DI提供程序本身的Microsoft.Extensions.DependencyInjection.Abstractions


10
我的一些Web服务项目已经在使用Ninject作为DI提供程序。在这种情况下,是否可以同时使用HttpClientFactory?还有没有其他使用HttpClientFactory与Ninject的机制?PS:我的Web服务不是在.NET Core中,而是使用.NET 4.7.*。 - Vinod
6
有配置方面的示例代码吗? - Nico
1
@Vinod 我们做的事情也一样,我们使用 new ServiceCollection 并使用该集合上的所有扩展方法来绑定所有内容,然后有一个 INinjectHttpClientFactory,它使用 IServiceCollection 服务提供程序来实际构建事物。 - tigerswithguitars
能否在 Ninject 模块内完成这个操作? - zolty13

37

正如@Panagiotis Kanavos所说,你需要添加
Microsoft.Extensions.HttpMicrosoft.Extensions.DependencyInjection
这里是我的ConsoleApp代码,你可以参考一下。

class Program
{
     static void Main(string[] args)
     {
         Test();
         Console.Read();
     }

     static async void Test()
     {
        var services = new ServiceCollection();
        //services.AddSingleton<xx,xx>();
        //...
        services.AddHttpClient();
        var serviceProvider = services.BuildServiceProvider();
        
        var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();
        var client = httpClientFactory.CreateClient();
        var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "http://www.baidu.com"));
        var content = await response.Content.ReadAsStringAsync();
        Console.WriteLine(content);
     }
}

如果我循环运行Test(),会创建多个client实例吗? - Gopi
@Gopi 是的,但如果您在此方法之外注册serviceProvider,则每个 var client = httpClientFactory.CreateClient(); 都会返回相同的客户端。 - bombek
1
HttpClient 可以被创建多次,这并不重要。只要使用相同的工厂实例,即 HttpMessageHandler 将被重用,这是关键的部分。 - Dogu Arslan

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