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

使用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è

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:40:29