如何用C#结合PAT获取Azure DevOps Artifacts的包及版本列表?
用C#结合PAT获取Azure DevOps Artifacts所有包的最新版本列表
当然可以实现,直接调用Azure DevOps的REST API,配合C#的Http客户端就能搞定,不需要依赖额外的重型SDK。下面是具体实现步骤和代码示例:
1. 准备PAT权限
首先确保你的Personal Access Token(PAT)拥有**Packaging (Read)**权限,否则会被API拒绝访问。创建PAT时,在权限列表里找到「Packaging」,勾选「Read」即可。
2. 核心实现代码
以下是完整的C#代码示例,包含认证、获取所有包、获取每个包最新版本的逻辑:
using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text.Json; using System.Threading.Tasks; class Program { // 替换成你的Azure DevOps信息 private const string Organization = "你的组织名"; private const string Project = "你的项目名"; private const string FeedId = "你的Feed ID"; // 可在Artifacts页面的Feed设置中找到 private const string PatToken = "你的PAT令牌"; static async Task Main(string[] args) { using var httpClient = new HttpClient(); // 设置认证头:PAT作为基本认证的密码,用户名留空 var authHeader = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($":{PatToken}")); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authHeader); // 1. 获取Feed下所有包的列表 var packagesUrl = $"https://pkgs.dev.azure.com/{Organization}/{Project}/_apis/packaging/feeds/{FeedId}/packages?api-version=7.1-preview.1"; var packagesResponse = await httpClient.GetAsync(packagesUrl); packagesResponse.EnsureSuccessStatusCode(); var packagesJson = await packagesResponse.Content.ReadAsStringAsync(); var packageList = JsonSerializer.Deserialize<PackageListResponse>(packagesJson); // 2. 遍历每个包,获取最新版本 foreach (var package in packageList.Value) { var versionsUrl = $"https://pkgs.dev.azure.com/{Organization}/{Project}/_apis/packaging/feeds/{FeedId}/packages/{package.Id}/versions?api-version=7.1-preview.1&$top=1"; var versionsResponse = await httpClient.GetAsync(versionsUrl); versionsResponse.EnsureSuccessStatusCode(); var versionsJson = await versionsResponse.Content.ReadAsStringAsync(); var versionList = JsonSerializer.Deserialize<PackageVersionListResponse>(versionsJson); if (versionList.Value.Count > 0) { var latestVersion = versionList.Value[0]; Console.WriteLine($"包名: {package.Name}, 最新版本: {latestVersion.Version}"); } } } } // 用于反序列化API响应的模型类 public class PackageListResponse { public List<PackageInfo> Value { get; set; } } public class PackageInfo { public string Id { get; set; } public string Name { get; set; } } public class PackageVersionListResponse { public List<PackageVersionInfo> Value { get; set; } } public class PackageVersionInfo { public string Version { get; set; } }
3. 注意事项
- Feed ID获取:如果不知道Feed ID,可以在Azure DevOps的Artifacts页面,进入对应Feed后,从浏览器地址栏中提取(格式类似
xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),或者调用Feed列表API获取。 - 分页处理:如果Feed中的包数量超过100个,API会返回分页数据,此时需要解析响应头中的
x-ms-continuationtoken,循环请求直到获取所有包。 - PAT安全:不要在代码中硬编码PAT,建议从环境变量、配置文件或者Azure Key Vault中读取。
- API版本:示例中使用的是
7.1-preview.1,可以根据Azure DevOps的版本选择合适的API版本,避免因API更新导致失效。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

