如何使用 API 和 c# 从 azure DevOps 服务器下载文件到指定路径

Posted

技术标签:

【中文标题】如何使用 API 和 c# 从 azure DevOps 服务器下载文件到指定路径【英文标题】:How download file form azure DevOps sever to a specified path using API and c# 【发布时间】:2020-12-02 10:03:12 【问题描述】:

我正在尝试使用 API 从 azure devops 服务器下载文件。API 给出成功响应。但是没有下载文件。如果我们删除格式参数,我们将得到文件链接的响应。通过单击该文件没有得到已下载。

示例代码

var personalaccesstoken = "ic2pqkzaeqv2dummyTokenDummypa";
                client1.BaseAddress = new Uri("https://dev.azure.com/organisatioTest/ProjectABC");
                client1.DefaultRequestHeaders.Accept.Clear();
                client1.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                client1.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                   Convert.ToBase64String(
                       System.Text.ASCIIEncoding.ASCII.GetBytes(
                           string.Format("0:1", "", personalaccesstoken))));
                HttpResponseMessage response1 = client1.GetAsync("_apis/git/repositories/e9e2f082-6f6d-99999b0bcc737a/items?scopePath=/Vjjj/DB/Data/ABC.sql&download=true&$format=zip&api-version=5.1").Result;

我们是否应该添加额外的 c# 代码来获取文件下载?如何指定下载路径?

【问题讨论】:

【参考方案1】:

在 C# 中,这个 URL 可以这样构造(假设变量是通过方法调用传入的):

    var url = $" https://dev.azure.com/organization/project/_apis/git/repositories/repositoryId/items?path=path&api-version=5.1";

有了格式正确的 URL,我们就可以使用 WebRequest 类调用 API。例如:

var request = (HttpWebRequest)WebRequest.Create(address);
request.UserAgent = "VSTS-Get";
request.Headers.Set(HttpRequestHeader.Authorization, GetAuthenticationHeaderValue(authentication).ToString());
request.ContentType = "application/json";
request.Method = httpMethod;
response = (HttpWebResponse)request.GetResponse();

使用 HttpWebResponse 对象,我们可以获得一个 Stream 对象,然后我们可以使用该对象将 API 结果写入本地文件。例如:

using (var responseStream = GetResponseStream(response))
     var fileName = Path.Get Filename(fileToDownload ?? "");     using (var fileStream = File.Create(Path.Combine(destination, fileName)))              responseStream.CopyTo(fileStream);     

更多详情请参考此链接:Get file API 和 sample blog

更新1

感谢sagar分享,更多详情请参考Download a file from azure devops server writes wrong data to the file

我们应该尝试使用个人访问令牌(PAT)。为了使用 PAT 进行身份验证,我们必须将授权用作“基本”而不是“承载”。此外,不要将 PAT 单独添加到我们拥有的请求标头中使用用户名和 PAT 的组合。说用户名的 base-64 编码字符串:PAT。

示例代码:

var personalaccesstoken = "wwwwwwwwwwwwwwwwwwy47b7ugkz32bubi64bw7fqdyfpa";
 var base64Creds = Convert.ToBase64String(Encoding.ASCII.GetBytes("SPabbbal@ABCTech.com:"+ personalaccesstoken));
request.Headers.Set(HttpRequestHeader.Authorization, "Basic " + base64Creds);

【讨论】:

我尝试使用此代码。但是我正在将 html 内容写入文件。未创建原始文件。文件中的内容不正确@Vito Liu-MSFT 嗨,sagar,我找到了similar issue,它已经分享了答案,请检查并在这里分享结果。 嗨维托。我提出了同样的问题。效果很好,兄弟。非常感谢。 嗨 sagar,很高兴听到您的问题已经解决。您介意在这张票中添加答案吗?或者我更新我的答案并将最新的票证链接添加到我的答案中。在这种情况下,其他人可以直接找到有用的解决方案。 嗨 sagar,我已经更新了答案。请检查一下。此外,您可以接受答案。在这种情况下,其他人可以直接找到有用的解决方案。

以上是关于如何使用 API 和 c# 从 azure DevOps 服务器下载文件到指定路径的主要内容,如果未能解决你的问题,请参考以下文章

C# API - 提供从 Azure Blob 存储下载的文件

使用 Azure Web API 应用程序中的 C# 从 Azure Data Lake 查询 parquet 数据

从 iis (C# API) 访问 azure 文件共享

C# - 如何从 Azure DevOps 工作项列表反序列化 json?

用于使用 Azure SQL Server 数据的 C# Web API

nUnit 和 Azure - 如何从 nUnit 启动 Dev Fabric