☰
C#——如何使用HttpClient类实现Http通信
2026/11/3 8:58:21 网站建设 项目流程

一、HttpClient指南

HttpClient类实例充当发送HTTP请求的会话。HttpClient实例是应用于该实例执行的所有请求的设置集合。此外,每个HttpClient实例都使用自己的连接池,将自己的请求与其他HttpClient实例执行的请求隔离开来。

实例化

HttpClient只被实例化一次,然后在应用程序的整个生命周期中重用。在.NET Core和.NET 5+中,HttpClient在处理程序实例中创建连接池,并在多个请求中重用连接。如果您为每个请求实例化一个HttpClient类,那么在高负载下可用的套接字数量将会耗尽。此耗尽将导致SocketException错误。

你可以通过传入一个“处理程序”(handle)来配置额外的选项,作为构造函数的一部分,比如 HttpClientHandler (或.NET Core 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 methodAPI
GETHttpClient.GetAsync
GETHttpClient.GetByteArrayAsync
GETHttpClient.GetStreamAsync
GETHttpClient.GetStringAsync
POSTHttpClient.PostAsync
PUTHttpClient.PutAsync

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询