如何使用C#直接获取Azure DevOps查询结果?
C#直接获取Azure DevOps查询结果的入门指南
一、核心结论:完全可以实现,不用手动下载CSV
你找到的Microsoft.TeamFoundationServer.Client和Microsoft.VisualStudio.Services.Client是官方SDK,比直接写REST API更适合新手——SDK已经封装了认证、请求等复杂逻辑,能帮你快速上手。
二、第一步:配置项目依赖与安全存储PAT
- 打开你的C#控制台项目,右键项目→管理NuGet程序包,搜索并安装以下两个包:
Microsoft.VisualStudio.Services.Client(负责Azure DevOps的认证与连接)Microsoft.TeamFoundationServer.Client(专门处理工作项查询的扩展包)
- 不要把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身份验证
七、新手学习路径建议
- 先吃透
VssConnection和WorkItemTrackingHttpClient两个核心类,SDK的大部分操作都围绕它们展开 - 记住Azure DevOps系统字段的固定命名(比如
System.Title、System.State),自定义字段需要去项目设置中查看引用名 - 从简单功能练起:先写代码获取单个工作项,再扩展到查询结果,最后整合CSV处理逻辑
- 调试时多断点查看
workItem.Fields的内容,确认你需要的字段都能正常获取
内容的提问来源于stack exchange,提问作者welshsteve147
相关产品推荐
相关产品推荐

