使用Azure DevOps Get Item API下载Git文件返回JSON而非原文件求助
问题:C#下载Azure DevOps Git文件时返回JSON而非原文件
我尝试用C#下载Azure DevOps中的Git文件,代码如下:
Stream response = await client.GetStreamAsync(url); var splitpath = path.Split("/"); Stream file = File.OpenWrite(splitpath[splitpath.Length - 1]); response.CopyToAsync(file); response.Close(); file.Close();
构造的请求URL:
string url = mainurl + name + "/_apis/git/repositories/" + rep + "/items?path=" + path + "&download=true&api-version=6.0";
但保存的文件是包含Git文件相关信息的JSON,而非原文件内容。尝试使用$format=zip的URL可以正常下载包含原文件的压缩包,我知道可以设置IncludeContent=true在JSON中获取内容,但需要直接获取原文件。
解决方案
1. 修复异步操作与资源管理问题
原代码中CopyToAsync是异步方法但未使用await,会导致流未完成复制就被关闭。同时应使用using语句自动管理流的生命周期,避免手动Close引发的资源泄漏。
2. 对文件路径进行URL编码
如果文件路径包含特殊字符(如空格、中文、特殊符号),直接拼接会导致URL参数解析错误,服务端返回JSON格式的错误信息。必须对路径进行URL编码。
修正后的代码
URL构造:
// 对文件路径进行URL编码,确保参数被正确解析 string encodedPath = Uri.EscapeDataString(path); string url = $"{mainurl}{name}/_apis/git/repositories/{rep}/items?path={encodedPath}&download=true&api-version=6.0";
下载代码:
using (Stream responseStream = await client.GetStreamAsync(url)) using (FileStream fileStream = File.OpenWrite(Path.GetFileName(path))) { await responseStream.CopyToAsync(fileStream); }
3. 排查响应错误
如果仍返回JSON,可先检查响应状态码及内容,确认是否为路径错误或权限问题:
var response = await client.GetAsync(url); if (!response.IsSuccessStatusCode) { string errorDetails = await response.Content.ReadAsStringAsync(); // 查看errorDetails中的错误信息,定位问题原因 } else { using (Stream responseStream = await response.Content.ReadAsStreamAsync()) using (FileStream fileStream = File.OpenWrite(Path.GetFileName(path))) { await responseStream.CopyToAsync(fileStream); } }
内容的提问来源于stack exchange,提问作者Simone Alessandrè
相关产品推荐
相关产品推荐

