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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:50:14