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

如何修复WinUI3推送本地文件夹至GitHub仓库的C#代码

问题分析与解决思路

核心问题:请求体不符合GitHub API要求

你的代码直接将文件文本作为请求体发送,但GitHub API的/repos/{owner}/{repo}/contents/{path}端点的PUT请求要求JSON格式的请求体,必须包含以下必填字段:

  • message:提交说明
  • content:文件内容的Base64编码字符串
    (可选字段branch,指定目标分支,默认使用仓库默认分支)

此前的403和当前的404错误,本质都是请求格式不正确导致API无法识别操作意图。

具体修复步骤

1. 修正请求体构造逻辑

将文件内容转为Base64编码,并构造符合API要求的JSON请求体:

foreach (var file in files)
{
    // 读取文件字节并转为Base64编码
    var fileBytes = await File.ReadAllBytesAsync(file.Path);
    var base64Content = Convert.ToBase64String(fileBytes);

    // 构造请求体JSON结构
    var requestBody = new
    {
        message = $"Add file: {file.Name}",
        content = base64Content,
        // 若目标分支非默认,取消注释并指定分支名
        // branch = "main"
    };
    var jsonContent = new StringContent(
        JsonSerializer.Serialize(requestBody),
        Encoding.UTF8,
        "application/json");

    var path = $"{rootFolder.Name}/{file.Name}";
    var requestUri = $"/repos/{repoOwner}/{repoName}/contents/{path}";
    try
    {
        var response = await client.PutAsync(requestUri, jsonContent);
        if (!response.IsSuccessStatusCode)
        {
            // 读取API返回的详细错误信息,这是排查关键
            var errorDetail = await response.Content.ReadAsStringAsync();
            Debug.WriteLine($"API错误: {response.StatusCode} - {errorDetail}");
            continue; // 不中断循环,继续处理其他文件
        }
        var responseString = await response.Content.ReadAsStringAsync();
        Debug.WriteLine($"推送成功: {responseString}");
    }
    catch (Exception ex)
    {
        Debug.WriteLine($"异常信息: {ex.Message}");
        continue;
    }
}

2. 排查404错误的额外可能原因

  • 路径匹配问题:确认path变量是否符合仓库目标路径。若要直接将文件放到仓库根目录,去掉rootFolder.Name/前缀;若要创建子文件夹,确保路径格式正确(如docs/test.txt)。
  • 大小写敏感:GitHub的仓库名称、路径区分大小写,检查repoOwner、repoName和路径的大小写是否与GitHub平台上完全一致。
  • 分支存在性:确认目标分支实际存在于仓库中(比如默认分支是main还是master)。
  • PAT权限:再次确认PAT拥有私有仓库的repo权限,若为企业仓库,需确保PAT已授权访问该企业资源。

3. 完善错误排查手段

不要仅捕获异常消息,当响应状态码非成功时,务必读取API返回的JSON错误内容——GitHub会明确返回问题原因(如路径不存在、权限不足、分支不存在等),这是快速定位问题的关键。

额外注意事项

  • 若要覆盖仓库中已存在的文件,需添加sha字段(该文件当前的SHA值,可通过GET请求获取),否则API会返回422错误。
  • 确保PAT未过期,且未被撤销权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:04:03