推荐使用 httpclient(.net core 2.1+/.net 5+),全局单例或 ihttpclientfactory 管理;get 用 getasync,post json 用 stringcontent + application/json;必设 timeout;反序列化优先 system.text.json,数值字段用可空类型,字符串加 jsonpropertyname;basic/bearer 认证注意 base64 编码与空格;本地调试需禁用代理、绕过证书(仅开发)、改用 127.0.0.1。

用 HttpClient 发起 GET/POST 请求最稳
别碰 WebClient 或过时的 HttpWebRequest,它们要么已弃用,要么默认不支持异步取消、连接池复用。.NET Core 2.1+ 和 .NET 5+ 的 HttpClient 是唯一推荐入口,它线程安全、可复用、自带 DNS 缓存和连接池。
常见错误是每次请求都 new 一个 HttpClient 实例——这会快速耗尽端口(TIME_WAIT),尤其在高并发下。正确做法是全局单例或用 IHttpClientFactory(ASP.NET Core 环境)。
- GET 请求直接用
GetAsync,返回HttpResponseMessage,别忘了检查response.IsSuccessStatusCode - POST JSON 数据:先用
JsonSerializer.Serialize序列化对象,再包进StringContent,ContentType设为"application/json" - 超时必须显式设:
client.Timeout = TimeSpan.FromSeconds(10);不设就是默认 100 秒,容易卡死
处理 JSON 响应时别硬写 dynamic 或手动拼字符串
反序列化失败是 REST 调用里第二高频问题,根源常在类型不匹配或空值字段。用 System.Text.Json(.NET Core 3.0+ 默认)比 Newtonsoft.Json 更轻、更快,且无额外 NuGet 依赖。
容易踩的坑:服务端返回 null 字段,但你的 C# 类属性是非 nullable 引用类型,反序列化直接抛 JsonException;或者整数字段有时是数字、有时是字符串(比如某些老接口返回 "123" 而非 123)。
- 定义响应类时,数值字段优先用可空类型:
public int? Code { get; set; } - 字符串字段加
[JsonPropertyName("xxx")]显式映射,避免大小写或下划线不一致 - 真要兼容混乱格式?用
JsonElement手动解析,而不是dynamic——后者绕过编译检查,运行时报错才暴露
带认证的请求:Token 和 Basic Auth 写法差异大
REST 接口八成要鉴权,但 Authorization 头的构造方式取决于后端类型。写错一个空格或大小写就 401,而且错误信息往往不提示具体哪错了。
Basic Auth 是 Base64 编码的 username:password,不是明文;Bearer Token 则是直接拼接字符串,中间有空格。这两个最容易手误写反或漏空格。
- Basic:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("user:pass"))) - Bearer:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your-jwt-token-here") - 如果 Token 是从登录接口拿的,记得存到
MemoryCache或ConcurrentDictionary,别每次调用都重新登录
本地调试时跨域、证书、代理全得关掉
本地跑不通,90% 不是代码问题,而是环境挡路。浏览器调试接口能通,C# 却报 HttpRequestException: Connection refused 或 AuthenticationException: The remote certificate is invalid,基本锁定三类干扰项。
开发机装了 Fiddler、Charles、Clash 或公司统一代理,HttpClient 默认会走系统代理,而很多代理对 localhost 不友好;自签名证书在 .NET 中默认被拒绝;前端启了 CORS,但后端没配,C# 客户端其实不受限——但你可能误以为受限。
- 绕过证书验证(仅开发):
new HttpClient(new HttpClientHandler { ServerCertificateCustomValidationCallback = (a,b,c,d) => true }) - 禁用代理:
new HttpClientHandler { UseProxy = false } - 地址别写
http://localhost:5000,改用http://127.0.0.1:5000,某些代理对 localhost 特殊处理
真正上线前,这些绕过逻辑必须删掉,尤其是证书校验——生产环境放行无效证书等于裸奔











