跳转到内容

C Sharp HttpClient 类

来自代码酷

C# HttpClient类[编辑 | 编辑源代码]

HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的类,属于 System.Net.Http 命名空间。它支持异步操作,是现代 C# 网络编程的核心组件之一,适用于与 REST API、Web 服务和其他 HTTP 端点交互。

概述[编辑 | 编辑源代码]

HttpClient 提供了高效、灵活的方式来执行 HTTP 请求(如 GET、POST、PUT、DELETE 等)。与旧的 WebClientHttpWebRequest 相比,它具有以下优势:

  • 异步支持:默认使用 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)

graph LR A[创建HttpClient] --> B[配置请求] B --> C[发送请求] C --> D{成功?} D -->|是| E[处理响应] D -->|否| F[错误处理] E --> G[释放资源] F --> G

实际案例[编辑 | 编辑源代码]

天气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 请求可抽象为: f:(M,U,H)R 其中:

  • M = 方法(GET/POST 等)
  • U = URL
  • H = 头信息集合
  • R = 响应

参见[编辑 | 编辑源代码]