使用C#调用GitHub API获取仓库内容时遇403错误求助
问题:GitHub API调用C#代码返回403,curl却正常
尝试通过GitHub API获取Arcadix/Product.Fusion仓库内容时,curl命令可正常获取数据,但相同逻辑的C#代码触发403错误。
可正常工作的curl命令
curl -L -H "Accept: application/vnd.github+json" -H "Authorization: Bearer <my_token>" -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/Arcadix/Product.Fusion/contents
触发403的C#代码
var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token123"); // token123已替换为实际令牌 httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github+json"); httpClient.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); var contentsUrl = $"https://api.github.com/repos/Arcadix/Product.Fusion/contents"; var contentsJson = httpClient.GetStringAsync(contentsUrl).Result; Console.WriteLine(contentsJson);
解决办法
1. 添加必填的User-Agent请求头
GitHub API强制要求所有请求包含User-Agent头,curl会自动生成类似curl/7.81.0的标识,但HttpClient默认不设置该头,这是导致403的核心原因。修改代码添加User-Agent:
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0"); // 替换为你的应用标识,格式无严格要求
2. 改用异步方式调用
使用.Result同步阻塞异步方法可能引发死锁或异常行为,建议使用标准的async/await模式:
static async Task Main() { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "你的实际令牌"); httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github+json"); httpClient.DefaultRequestHeaders.Add("X-GitHub-Api-Version", "2022-11-28"); httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0"); var contentsUrl = "https://api.github.com/repos/Arcadix/Product.Fusion/contents"; var contentsJson = await httpClient.GetStringAsync(contentsUrl); Console.WriteLine(contentsJson); }
3. 验证令牌与仓库权限
- 确认GitHub令牌拥有
repo权限(若仓库为私有) - 确认你有权限访问Arcadix/Product.Fusion仓库
内容的提问来源于stack exchange,提问作者Arun kumar
相关产品推荐
相关产品推荐

