C#——如何使用HttpClient类实现Http通信

发布时间:2026/11/2 11:55:07
C#——如何使用HttpClient类实现Http通信 一、HttpClient指南HttpClient类实例充当发送HTTP请求的会话。HttpClient实例是应用于该实例执行的所有请求的设置集合。此外,每个HttpClient实例都使用自己的连接池,将自己的请求与其他HttpClient实例执行的请求隔离开来。实例化HttpClient只被实例化一次,然后在应用程序的整个生命周期中重用。在.NETCore和.NET5+中,HttpClient在处理程序实例中创建连接池,并在多个请求中重用连接。如果您为每个请求实例化一个HttpClient类,那么在高负载下可用的套接字数量将会耗尽。此耗尽将导致SocketException错误。你可以通过传入一个“处理程序”(handle)来配置额外的选项,作为构造函数的一部分,比如 HttpClientHandler (或.NETCore 2.1及更高版本中的SocketsHttpHandler)。一旦提交了请求,处理程序上的连接属性就不能更改,因此创建新的HttpClient实例的一个原因是需要更改连接属性。如果不同的请求需要不同的设置,这也可能导致应用程序具有多个HttpClient实例,其中每个实例都被适当地配置,然后请求在相关的客户端上发出。HttpClient只在创建连接时解析DNS项。它不跟踪DNS服务器指定的任何生存时间(TTL)。如果DNS条目定期更改(这可能发生在某些容器场景中),客户机将不尊重这些更新。要解决这个问题,可以通过设置SocketsHttpHandler.PooledConnectionLifetime属性来限制连接的生存期。,以便在替换连接时需要进行DNS查找。public class GoodController : ApiController { private static readonly HttpClient httpClient; static GoodController() { var socketsHandler = new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(2) }; httpClient = new HttpClient(socketsHandler); } }除了只创建一个HttpClient实例之外,您还可以使用IHttpClientFactory来管理HttpClient实例。有关更多信息,请参见使用HttpClient的指南。派生HttpClient还充当更具体的HTTP客户端的基类。一个例子是FacebookHttpClient,它提供了特定于Facebook web服务的附加方法(例如,GetFriends方法)。派生类不应该覆盖类上的虚方法。相反,使用一个接受HttpMessageHandler的构造函数重载来配置任何请求前或请求后处理。DNS行为HttpClient只在创建连接时解析DNS项。它不跟踪DNS服务器指定的任何生存时间(TTL)。如果DNS条目定期更改(在某些情况下可能发生),客户端将不尊重这些更新。要解决这个问题,您可以通过设置PooledConnectionLifetime属性来限制连接的生存期,以便在替换连接时重复DNS查找。考虑下面的例子:var handler = new SocketsHttpHandler { PooledConnectionLifetime = TimeSpan.FromMinutes(15) // Recreate every 15 minutes }; var sharedClient = new HttpClient(handler);前面的HttpClient配置为重复使用连接15分钟。在PooledConnectionLifetime指定的时间范围过后,将关闭连接并创建一个新连接。池连接HttpClient的连接池被链接到底层的SocketsHttpHandler。在处置HttpClient实例时,它将处置池内的所有现有连接。如果稍后向同一服务器发送请求,则必须重新创建一个新连接。因此,不必要的连接创建会造成性能损失。此外,TCP端口在连接关闭后不会立即释放。(有关更多信息,请参阅RFC 9293中的TCP TIME-WAIT。)如果请求率很高,则可能耗尽操作系统对可用端口的限制。为了避免端口耗尽问题,我们建议为尽可能多的HTTP请求重用HttpClient实例。二、使用 HttpClient 类发出 HTTP 请求2.1、创建HttpClient// HttpClient lifecycle management best practices: // https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines#recommended-use private static HttpClient sharedClient = new() { BaseAddress = new Uri("https://jsonplaceholder.typicode.com"), };1、实例化新的HttpClient实例作为静态变量。建议在应用程序的生命周期内重复使用HttpClient实例。2、将HttpClient.BaseAddress设置为"https://jsonplaceholder.typicode.com"。​2.2、​发出 HTTP 请求要发出 HTTP 请求,请调用以下任一 API:HTTP methodAPIGETHttpClient.GetAsyncGETHttpClient.GetByteArrayAsyncGETHttpClient.GetStreamAsyncGETHttpClient.GetStringAsyncPOSTHttpClient.PostAsyncPUTHttpClient.PutAsync

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询