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

Noe*_*oel 8 .net-core asp.net-core httpclientfactory

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

引用它

ASP.NET Core 2.1中将出现一个新的HttpClientFactory功能,它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题.

所有示例都显示在asp.net应用程序的启动类中连接它,例如

public void ConfigureServices(IServiceCollection services)
{
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            services.AddHttpClient();
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是你可以在ASP.NET核心之外使用吗?如果是这样的例子

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

Ale*_*bov 16

根据文档, HttpClientFactory是.Net Core 2.1的一部分,因此您不需要ASP.NET来使用它.而且还有使用一些方法进行了描述.最简单的方法是使用Microsoft.Extensions.DependencyInjection和AddHttpClient扩展方法.

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

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

    var client = httpClientFactory.CreateClient();
}
Run Code Online (Sandbox Code Playgroud)

  • @Noel,提供的代码用于.Net Core控制台应用程序.另外在你的链接汇编:Microsoft.Extensions.Http.dll - 所以没有连接到asp.net (2认同)
  • AddHttpClient()在Microsoft.Extensions.Http nuget包中 (2认同)
  • 是的,你是对的,我能够直接使用 Microsoft.Extensions.Http。文档中不太清楚,建议使用 aspnet 包装器包 (2认同)
  • Microsoft 提供了相同场景的新版本:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#use-ihttpclientfactory-in-a-控制台应用程序 (2认同)

Noe*_*oel 10

感谢您的回复。

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

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

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

  2. 使用通用主机,例如在 .ConfigureServices() 方法中添加 httpclientFactory

有关在控制台应用程序中使用的博客文章,请参阅此处


小智 6

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

你不需要 ASP.NET 来使用它

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

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

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

    ServiceCollections.AddHttpClient();
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您想使用不同的名称/设置注册 HttpClient 以与不同的 Web 服务器进行通信(不同的设置,例如:不同的基本网址)

    ServiceCollection.AddHttpClient(
    "yourClientName", x => x.BaseAddress = new Uri("http://www.mywebserver.com"))
    
    Run Code Online (Sandbox Code Playgroud)
  • In case you want to add DelegateHendlers, you need to add it both to your httpClient and your DI container.

    ServiceCollection
            .AddHttpClient(clientName, x => x.BaseAddress = new Uri("http://www.google.com"))
            .AddHttpMessageHandler<DummyDelegateHandler>();
    ServiceCollection.AddScoped<DummyDelegateHandler>();
    
    Run Code Online (Sandbox Code Playgroud)
  • register your HttpClient to use HttpClientFactory

    ServiceCollection.AddScoped<HttpClient>(x => 
    x.GetService<IHttpClientFactory>().CreateClient("yourClientName"));
    
    Run Code Online (Sandbox Code Playgroud)
  • To resolve http client:

    var client = ServiceProvider.GetService<HttpClient>();
    
    Run Code Online (Sandbox Code Playgroud)