C#调用GitHub API下载私有仓库子目录文件报403/404问题咨询
错误产生原因
- 路径拼接不规范:如果传入的
file参数开头携带斜杠,会导致最终请求URL的contents/后出现双斜杠,GitHub API无法正确识别路径返回404;如果路径中包含空格、中文等特殊字符未做URL编码,也会触发404错误。 - 二进制文件读取逻辑错误:当前实现使用
StreamReader文本读取器处理响应流,先将二进制内容转成UTF8字符串再转回字节数组写入文件,会破坏rar、压缩包、图片等非文本文件的二进制结构,同时可能触发GitHub API的流量校验异常,导致403错误。 - 未指定目标分支:如果目标文件不在仓库默认分支(通常为main/master),GitHub API默认只会查询默认分支下的路径,找不到对应文件就返回404。
修复实现
直接修改下载逻辑,取消不必要的文本转码步骤,增加路径校验和编码处理,支持指定分支,修复后的代码如下:
private void DownloadFile(string file, string location, string branch = "main") { var githubToken = "[token]"; // 清理路径首尾斜杠,避免拼接后出现双斜杠 file = file.Trim('/'); // 拼接API地址,对路径做URL编码,同时支持指定分支 var requestUrl = $"https://api.github.com/repos/[owner]/[repo]/contents/{Uri.EscapeDataString(file)}?ref={branch}"; var request = (HttpWebRequest)WebRequest.Create(requestUrl); request.Headers.Add(HttpRequestHeader.Authorization, $"token {githubToken}"); request.Accept = "application/vnd.github.v3.raw"; // 建议替换为你的应用名称或GitHub用户名,GitHub要求合法UserAgent request.UserAgent = "useragent"; try { using (var response = request.GetResponse()) using (var responseStream = response.GetResponseStream()) using (var fs = File.Create(location)) { // 直接复制二进制流,兼容所有格式文件,无需转码 responseStream.CopyTo(fs); } } catch (Exception ex) { MessageBox.Show($"ERROR: {ex}\n {file}"); } }
注意事项
- 确保你的GitHub Token已经开启
repo权限,仅拥有公开仓库读取权限的Token无法访问私有仓库子目录资源。 - 单文件大小超过100MB时,GitHub Contents API不支持直接下载,需要改用Git Data API拉取对应Blob资源。
- 如果仍然出现403错误,可检查Token是否过期,以及仓库是否开启了IP访问限制。
内容的提问来源于stack exchange,提问作者HermanBajo
相关产品推荐
相关产品推荐

