C Sharp HttpClient 类
外观
C# HttpClient类[编辑 | 编辑源代码]
HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的类,属于 System.Net.Http
命名空间。它支持异步操作,是现代 C# 网络编程的核心组件之一,适用于与 REST API、Web 服务和其他 HTTP 端点交互。
概述[编辑 | 编辑源代码]
HttpClient 提供了高效、灵活的方式来执行 HTTP 请求(如 GET、POST、PUT、DELETE 等)。与旧的 WebClient
或 HttpWebRequest
相比,它具有以下优势:
- 异步支持:默认使用
async/await
模式。 - 可重用性:单个实例可处理多个请求(需注意生命周期管理)。
- 扩展性:支持自定义消息处理管道。
核心功能[编辑 | 编辑源代码]
- 发送 HTTP 请求并接收响应
- 处理请求/响应头、内容体和状态码
- 支持 HTTPS、Cookie 和身份验证
- 可配置超时、代理和缓冲策略
基本用法[编辑 | 编辑源代码]
以下示例展示如何用 HttpClient 发送 GET 请求:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
using var client = new HttpClient();
string url = "https://api.example.com/data";
try
{
HttpResponseMessage response = await client.GetAsync(url);
response.EnsureSuccessStatusCode(); // 检查状态码
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求失败: {ex.Message}");
}
}
}
输出示例(假设 API 返回 JSON):
{ "id": 1, "name": "Sample Data", "value": 42 }
进阶特性[编辑 | 编辑源代码]
POST 请求示例[编辑 | 编辑源代码]
发送 JSON 数据的 POST 请求:
using System.Text;
using System.Text.Json;
var client = new HttpClient();
var requestData = new { Name = "Test", Value = 123 };
string json = JsonSerializer.Serialize(requestData);
var content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("https://api.example.com/items", content);
请求头管理[编辑 | 编辑源代码]
添加自定义请求头:
client.DefaultRequestHeaders.Add("User-Agent", "C# HttpClient");
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "your_token_here");
超时配置[编辑 | 编辑源代码]
设置全局超时(默认为 100 秒):
client.Timeout = TimeSpan.FromSeconds(30);
生命周期管理[编辑 | 编辑源代码]
HttpClient 实现了 IDisposable
,但最佳实践是:
- 长时间运行的应用程序:重用单个实例
- 短期应用:使用
IHttpClientFactory
(ASP.NET Core)
实际案例[编辑 | 编辑源代码]
天气API查询[编辑 | 编辑源代码]
以下完整示例演示获取天气数据:
public class WeatherService
{
private readonly HttpClient _client;
public WeatherService()
{
_client = new HttpClient();
_client.BaseAddress = new Uri("https://api.weatherapi.com/v1/");
}
public async Task<string> GetCurrentWeather(string city)
{
string endpoint = $"current.json?key=YOUR_KEY&q={city}";
try
{
var response = await _client.GetAsync(endpoint);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
catch
{
return "无法获取天气数据";
}
}
}
性能优化[编辑 | 编辑源代码]
- 连接池:默认启用 HTTP/1.1 连接池
- HTTP/2:可通过设置
HttpRequestMessage.Version
启用 - 压缩:支持自动解压
HttpClientHandler.AutomaticDecompression
常见问题[编辑 | 编辑源代码]
Socket 耗尽[编辑 | 编辑源代码]
解决方案:
- 重用 HttpClient 实例
- 使用
IHttpClientFactory
异步死锁[编辑 | 编辑源代码]
错误写法:
var result = client.GetAsync(url).Result; // 可能死锁
正确写法:
var result = await client.GetAsync(url); // 异步等待
数学表示[编辑 | 编辑源代码]
HTTP 请求可抽象为: 其中:
- = 方法(GET/POST 等)
- = URL
- = 头信息集合
- = 响应