You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用HttpClient发起HTTPS GET请求调用API返回400错误如何解决

问题根因

Coinbase 公开API会校验请求的User-Agent头合法性,你当前代码中初始化的HttpClient未手动配置该请求头,.NET 默认发出的请求不带合规的UA标识,会直接被接口风控规则拦截返回400错误。这也是浏览器、Postman请求同个接口能正常响应的核心原因:这两类工具会自动在请求中携带合法的UA标识,不会被拦截。

修复代码

首先遵循.NET 官方最佳实践,全局复用单例HttpClient避免套接字资源耗尽,初始化时配置合法UA头,调用时避免用.Result同步阻塞引发死锁:

// 全局单例复用,不要在每次请求时using新建HttpClient
private static readonly HttpClient Client = new HttpClient();

// 程序启动阶段执行一次配置即可
Client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36");

// 接口调用逻辑
var response = await Client.GetAsync("https://api.exchange.coinbase.com/products/ETH-USD/candles?granularity=300&start=2022-03-22&end=2022-03-23");
// 校验请求状态,非200状态码会主动抛出异常方便定位
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
补充说明
  • UA头不需要完全仿造浏览器,你也可以自定义为自己的应用标识,比如"MyCustomApp/1.0",只要UA头不为空,就不会被Coinbase的基础风控拦截
  • 禁止使用.Result、.Wait()这类方法同步阻塞异步HTTP请求,高并发场景下极易出现线程池饿死、请求上下文死锁问题
  • 禁止每次请求都新建HttpClient实例,长时间运行会耗尽系统可用套接字,引发随机的请求失败问题,单例复用是官方推荐的标准用法

内容的提问来源于stack exchange,提问作者scapegoat17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:09:27