C# (.NET) HTTP客户端:顶级Web请求库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C# (.NET) HTTP客户端:顶级库综述



在开发基于C# (.NET)的现代应用程序时,几乎总是需要与远程Web服务和API进行交互。基础类HttpClient提供了所有必要功能,但对于复杂场景(重试、序列化、便捷的Fluent接口),社区创建了几个强大的封装库。本文将介绍四种最流行的C# (.NET) HTTP客户端,比较它们的功能,并提供代码示例。



1. HttpClient(.NET内置)



HttpClient是来自System.Net.Http命名空间的标准类,适用于所有.NET版本(包括.NET Core、.NET 5/6/7/8)。它是所有其他库所基于的基础。



优点:

  • 无需安装额外包(包含在BCL中)。
  • 完全控制请求发送过程。
  • 支持HTTP/1.1、HTTP/2、HTTP/3。
  • 内置gzip/deflate压缩支持。
  • 支持流式处理。


缺点:

  • 需要手动管理重试。
  • 无内置JSON序列化/反序列化。
  • 典型操作代码冗长。


使用示例:

using System.Net.Http;using System.Text.Json;using System.Threading.Tasks;

public class UserClient{ private readonly HttpClient _httpClient;

public UserClient() { _httpClient = new HttpClient(); _httpClient.BaseAddress = new Uri("https://jsonplaceholder.typicode.com"); }

public async Task<User> GetUserAsync(int id) { var response = await _httpClient.GetAsync($"/users/{id}"); response.EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<User>(json); }

public async Task<User> CreateUserAsync(User user) { var json = JsonSerializer.Serialize(user); var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync("/users", content); response.EnsureSuccessStatusCode(); var responseJson = await response.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize<User>(responseJson); }}

public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; }}


2. RestSharp



RestSharp是最古老且最流行的REST API库之一。它提供便捷的Fluent接口、自动JSON/XML序列化/反序列化以及内置错误处理。



优点:

  • 简单直观的API。
  • 自动序列化/反序列化。
  • 内置认证支持(Basic、OAuth、JWT)。
  • 支持文件上传(multipart/form-data)。
  • 灵活的错误处理和重试系统。


缺点:

  • 依赖外部包(NuGet: RestSharp)。
  • 某些场景下对HTTP的抽象过度。


使用示例:

using RestSharp;using System.Threading.Tasks;

public class UserClient{ private readonly RestClient _client;

public UserClient() { _client = new RestClient("https://jsonplaceholder.typicode.com"); }

public async Task<User> GetUserAsync(int id) { var request = new RestRequ

推荐