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

如何使用C#直接获取Azure DevOps查询结果?

C#直接获取Azure DevOps查询结果的入门指南

一、核心结论:完全可以实现,不用手动下载CSV

你找到的Microsoft.TeamFoundationServer.Client和Microsoft.VisualStudio.Services.Client是官方SDK,比直接写REST API更适合新手——SDK已经封装了认证、请求等复杂逻辑,能帮你快速上手。

二、第一步:配置项目依赖与安全存储PAT

  1. 打开你的C#控制台项目,右键项目→管理NuGet程序包,搜索并安装以下两个包:
    • Microsoft.VisualStudio.Services.Client(负责Azure DevOps的认证与连接)
    • Microsoft.TeamFoundationServer.Client(专门处理工作项查询的扩展包)
  2. 不要把PAT硬编码到代码里,新建appsettings.json文件(控制台项目默认没有的话手动添加),存储配置:
    {
      "AzureDevOpsConfig": {
        "OrganizationUrl": "https://dev.azure.com/你的组织名",
        "ProjectName": "你的项目名",
        "PersonalAccessToken": "你生成的PAT令牌"
      }
    }
    
    记得把appsettings.json的复制到输出目录设置为「始终复制」,否则运行时会读不到配置。

三、第二步:用PAT建立Azure DevOps连接

先写基础的连接代码,这是后续所有操作的前提:

using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.Extensions.Configuration;

// 读取配置文件
var config = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build();
var orgUrl = config["AzureDevOpsConfig:OrganizationUrl"];
var projectName = config["AzureDevOpsConfig:ProjectName"];
var pat = config["AzureDevOpsConfig:PersonalAccessToken"];

// 用PAT创建认证凭据
var credentials = new VssBasicCredential(string.Empty, pat);

// 建立与Azure DevOps的连接
using var connection = new VssConnection(new Uri(orgUrl), credentials);

// 获取工作项查询的客户端(后续查询操作全靠它)
var workItemClient = connection.GetClient<WorkItemTrackingHttpClient>();

四、第三步:获取目标查询的结果

首先要拿到查询ID:打开Azure DevOps网页端的目标查询,URL里的queryId参数对应的一串GUID就是。然后用客户端执行查询:

// 替换成你自己的查询ID
var targetQueryId = "xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

// 执行查询,拿到工作项的引用列表
var queryResult = await workItemClient.QueryByIdAsync(targetQueryId, projectName);

// 将引用转换为完整的工作项详情
var workItems = new List<WorkItem>();
if (queryResult.WorkItems != null)
{
    foreach (var itemRef in queryResult.WorkItems)
    {
        var fullWorkItem = await workItemClient.GetWorkItemAsync(projectName, itemRef.Id);
        workItems.Add(fullWorkItem);
    }
}

五、第四步:将结果转为CSV(复用你的ETL逻辑)

拿到workItems列表后,就可以用你已有的CSV处理逻辑生成文件,举个简单示例:

// 定义CSV表头,根据你需要的字段调整
var csvHeaders = new List<string> { "ID", "标题", "状态", "指派给" };
var csvLines = new List<string> { string.Join(",", csvHeaders) };

// 遍历工作项提取字段
foreach (var item in workItems)
{
    var id = item.Id.ToString();
    // 处理字段中的逗号,避免CSV格式混乱
    var title = item.Fields["System.Title"].ToString().Replace(",", "");
    var state = item.Fields["System.State"].ToString();
    // 处理空值情况,比如未指派的工作项
    var assignedTo = item.Fields.ContainsKey("System.AssignedTo") 
        ? ((Newtonsoft.Json.Linq.JObject)item.Fields["System.AssignedTo"])["displayName"].ToString() 
        : "未指派";
    
    csvLines.Add(string.Join(",", id, title, state, assignedTo));
}

// 写入CSV文件,路径可自行修改
File.WriteAllLines("AzureDevOps查询结果.csv", csvLines);

六、解决Visual Studio连接Azure DevOps崩溃的问题

之前连接导致解决方案关闭,大概率是VS缓存异常:

  • 关闭Visual Studio,删除解决方案根目录下的.vs隐藏文件夹,重新打开项目再尝试连接
  • 连接时选择「使用个人访问令牌」,输入你的PAT,不要用默认的Windows身份验证

七、新手学习路径建议

  1. 先吃透VssConnection和WorkItemTrackingHttpClient两个核心类,SDK的大部分操作都围绕它们展开
  2. 记住Azure DevOps系统字段的固定命名(比如System.Title、System.State),自定义字段需要去项目设置中查看引用名
  3. 从简单功能练起:先写代码获取单个工作项,再扩展到查询结果,最后整合CSV处理逻辑
  4. 调试时多断点查看workItem.Fields的内容,确认你需要的字段都能正常获取

内容的提问来源于stack exchange,提问作者welshsteve147

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 19:54:54