FEATURED · 精选文章

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

发布时间 / 2026/8/29 12:55:21
来源 / 创域科博编辑部
栏目 / 资讯中心
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
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻