【问题标题】:Can I use HttpClientFactory in a .NET.core app which is not ASP.NET Core?我可以在不是 ASP.NET Core 的 .NET.core 应用程序中使用 HttpClientFactory 吗?
【发布时间】:2018-10-03 08:10:56
【问题描述】:

我已阅读有关使用 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 core 应用程序)需要进行 Web 调用,那么为什么这不是 .net core api 的一部分而不是放入 asp.net core api 中

【问题讨论】:

标签: c# asp.net-core .net-core httpclientfactory


【解决方案1】:

根据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();
}

【讨论】:

【解决方案2】:

感谢您的回复。

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

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

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

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

查看这里blog post using in console app

【讨论】:

    【解决方案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>();
      

    【讨论】:

      【解决方案4】:

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

      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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-02
        • 2013-05-08
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        相关资源
        最近更新 更多