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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:45:01