如何修复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
相关产品推荐
相关产品推荐

