如何通过C# TFS客户端库获取团队及用户的工作容量与休假信息?
获取TFS团队及用户工作容量/休假信息的C#实现
我之前也折腾过这个需求,确实TFS官方客户端库的这部分文档藏得比较深,很容易走偏。下面是我实际验证过的方案,用官方的客户端库就能搞定:
第一步:准备依赖包
首先确保你的项目安装了这两个NuGet包:
Microsoft.TeamFoundationServer.Client(核心TFS客户端API)Microsoft.VisualStudio.Services.Client(用于身份验证和连接)
获取团队工作容量及成员休假信息
工作容量和休假是和**迭代(Iteration)**绑定的,所以需要先定位到目标团队的具体迭代,再获取对应的数据:
using Microsoft.TeamFoundation.Core.WebApi; using Microsoft.TeamFoundation.Work.WebApi; using Microsoft.VisualStudio.Services.Client; using Microsoft.VisualStudio.Services.Common; // 1. 建立与TFS服务器的连接 var tfsUri = new Uri("http://your-tfs-server:8080/tfs/YourCollection"); var credentials = new VssBasicCredential("", "your-personal-access-token"); // 可用PAT或域账号 using var connection = new VssConnection(tfsUri, credentials); // 2. 获取TeamSettingsHttpClient实例 var teamSettingsClient = connection.GetClient<TeamSettingsHttpClient>(); // 3. 定位目标团队(需要团队ID/名称,以及项目名称) string projectName = "YourProjectName"; string teamName = "YourTeamName"; var team = await teamSettingsClient.GetTeamAsync(projectName, teamName); // 4. 获取团队的当前活跃迭代(也可指定迭代路径/ID) var teamSettings = await teamSettingsClient.GetTeamSettingsAsync(team.ProjectId, team.Id); var currentIteration = teamSettings.CurrentIteration; // 5. 获取该迭代下的团队容量信息(包含成员的工作容量和休假) var capacities = await teamSettingsClient.GetCapacitiesAsync(team.ProjectId, team.Id, currentIteration.Id); // 6. 遍历处理每个成员的信息 foreach (var capacity in capacities) { Console.WriteLine($"成员: {capacity.TeamMember.DisplayName}"); Console.WriteLine($"每日工作容量: {capacity.DaysPerWeek} 天/周"); Console.WriteLine($"已分配容量: {capacity.CapacityPerDay} 小时/天"); // 休假信息 if (capacity.DaysOff.Any()) { Console.WriteLine("休假记录:"); foreach (var dayOff in capacity.DaysOff) { Console.WriteLine($"- {dayOff.Start.Date} 至 {dayOff.End.Date}"); } } Console.WriteLine("---"); }
单独获取用户全局休假(非迭代绑定)
如果需要获取用户在TFS中的全局休假(不是针对某个迭代的),官方客户端库没有直接封装对应的API,不过可以通过调用TFS的REST API来实现,这里复用已有的VssConnection身份验证:
var httpClient = connection.GetClient<HttpClient>(); var userId = "user-guid-or-email"; var restUrl = $"{tfsUri}/_apis/calendar/users/{userId}/events?api-version=6.0-preview.1"; var response = await httpClient.GetAsync(restUrl); response.EnsureSuccessStatusCode(); var vacationEvents = await response.Content.ReadAsStringAsync(); // 解析返回的JSON数据即可得到用户的休假日历事件
注意事项
- 确保你的PAT(个人访问令牌)拥有Work Item Read和Team Settings Read权限;
- 该方案适用于TFS 2018及以上版本,以及Azure DevOps Server;
- 如果找不到迭代或容量数据,先检查团队是否已配置迭代和成员容量设置(在TFS网页端的团队设置里确认)。
内容的提问来源于stack exchange,提问作者Rocco
相关产品推荐
相关产品推荐

