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

时间:2018-10-03 08:10:56

标签: asp.net-core .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();
} 

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

我本以为很多非Web应用程序(.net核心应用程序)都需要进行Web调用,所以为什么这不是.net core api的一部分,而是放入asp.net core API中呢?

4 个答案:

答案 0 :(得分:9)

根据documentation,HttpClientFactory是.Net Core 2.1的一部分,因此您不需要ASP.NET即可使用它。并介绍了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();
}

答案 1 :(得分:3)

如答案之一所示,

您不需要ASP.NET即可使用

但是,您需要进行一些工作以使其进入依赖项注入(DI)

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

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

    ServiceCollections.AddHttpClient();
    
  • 如果要注册具有不同名称/设置的HttpClient以便与不同的Web服务器通信(不同的设置,例如:不同的基本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>();
    

答案 2 :(得分:1)

感谢您的答复。

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

有几种方法可以执行此操作,具体取决于您要走的路。 这里是2:

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

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

在此处查看blog post using in console app

答案 3 :(得分:1)

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

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

您的课程如下:

public class Foo : IFoo
{
    private readonly HttpClient httpClient;

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