我可以在非 ASP.NET Core 的 .NET.core 应用程序中使用 HttpClientFactory 吗?

Can I use HttpClientFactory in a .NET.core app which is not ASP.NET Core?

我已经阅读了关于使用 HttpClientFactory 的热门博客 post https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore

引用它

A new HttpClientFactory feature is coming in ASP.NET Core 2.1 which helps to solve some common problems that developers may run into when using HttpClient instances to make external web requests from their applications.

所有示例都显示在 asp.net 应用程序的启动 class 中进行接线,例如

public void ConfigureServices(IServiceCollection services)
{
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddHttpClient();
} 

我的问题是您可以在 ASP.NET 内核之外使用吗? 如果有的话,有例子吗

我原以为很多非网络应用程序(.net 核心应用程序)需要进行网络调用,那么为什么这不是 .net 核心的一部分 api 而不是放入 asp.net核心 api

根据documentation HttpClientFactory is a part of .Net Core 2.1, so you don't need ASP.NET to use it. And there描述的一些使用方法。最简单的方法是使用 Microsoft.Extensions.DependencyInjection 和 AddHttpClient 扩展方法。

static void Main(string[] args)
{
    var serviceProvider = new ServiceCollection().AddHttpClient().BuildServiceProvider();

    var httpClientFactory = serviceProvider.GetService<IHttpClientFactory>();

    var client = httpClientFactory.CreateClient();
}

感谢回复。

因此可以在控制台应用程序中使用。

有几种方法可以做到这一点,具体取决于您要走的路。 这里有 2 个:

  1. 直接添加到 ServiceCollection 例如services.AddHttpClient()

  2. Use Generic host 例如在 .ConfigureServices() 方法中添加 httpclientFactory

blog post using in console app

请看这里

仅提供已接受答案中第一种建议方法的示例代码:

services.AddHttpClient<IFoo, Foo>(); // where services is of type IServiceCollection

你的 class 看起来像:

public class Foo : IFoo
{
    private readonly HttpClient httpClient;

    public Consumer(HttpClient httpClient)
    {
        this.httpClient = httpClient;
    }
}

正如其中一个答案所暗示的那样,

you do not need ASP.NET to use it

但是,您需要一些工作才能将其纳入依赖注入 (DI):

  • 安装microsoft.extensions.http(与ASP.NET无关)

  • 配置 DI 时,请使用此扩展。它注册 builders/httpclientFactory/...(在 github 上查看其源代码)

    ServiceCollections.AddHttpClient();
    
  • 如果你想用不同的 names/settings 注册 HttpClient 来与不同的网络服务器通信(不同的设置,例如:不同的基本 url)

    ServiceCollection.AddHttpClient(
    "yourClientName", x => x.BaseAddress = new Uri("http://www.mywebserver.com"))
    
  • 如果你想添加 DelegateHendlers,你需要将它同时添加到你的 httpClient 和你的 DI 容器中。

    ServiceCollection
            .AddHttpClient(clientName, x => x.BaseAddress = new Uri("http://www.google.com"))
            .AddHttpMessageHandler<DummyDelegateHandler>();
    ServiceCollection.AddScoped<DummyDelegateHandler>();
    
  • 注册您的 HttpClient 以使用 HttpClientFactory

    ServiceCollection.AddScoped<HttpClient>(x => 
    x.GetService<IHttpClientFactory>().CreateClient("yourClientName"));
    
  • 要解析 http 客户端:

    var client = ServiceProvider.GetService<HttpClient>();