首页 > 解决方案 > HttpClient,似乎很难正确使用

问题描述

只是关于正确用法的另一个问题HttpClient,因为除非我遗漏了什么,否则我会HttpClient在 Microsoft Docs 中发现相互矛盾的信息。这两个链接是我困惑的根源:

  1. https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
  2. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#typed-clients

第一个声明最好的方法是共享单例HttpClient实例,第二个 AddHttpClient<TypedClient>()将服务注册为瞬态,更具体地说(从该 URL 复制):

类型化的客户端在 DI 中注册为瞬态的。在上述代码中,AddHttpClient注册GitHubService为临时服务。此注册使用工厂方法来:

  1. 创建一个HttpClient.
  2. 创建一个实例GitHubService,将实例传递HttpClient给它的构造函数。

我一直在使用AddHttpClient<TypedClient>()并感到安全,但现在我再次感到困惑......更糟糕的是,我发现@rynowak 的这个github 问题评论指出:

如果您正在构建一个计划分发的库,我强烈建议您完全不要依赖 IHttpClientFactory,并让您的消费者传入一个 HttpClient实例。

为什么这对我很重要?因为,我正在创建一个主要做两件事的库:

  1. 从令牌服务中检索访问令牌 ( IdentityServer4)
  2. 使用该令牌访问受保护的资源

我正在遵循上面链接 2中描述的类型化客户端方法:

//from https://github.com/georgekosmidis/IdentityServer4.Contrib.HttpClientService/blob/master/src/IdentityServer4.Contrib.HttpClientService/Extensions/ServiceCollectionExtensions.cs
services.AddHttpClient<IIdentityServerHttpClient, IdentityServerHttpClient>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5));

任何有关基于HttpClient外观的具体实现的建议或示例都将受到欢迎。

谢谢!

标签: .net-corehttpclient

解决方案


推荐阅读