如何通过C#调用TFS API获取工作项讨论评论及相关日期
解决TFS工作项评论及日期获取问题
我来帮你搞定这个TFS工作项评论的获取需求!你之前遍历Revisions的方式会拿到所有工作项的变更记录(包括附件、字段修改这些),这就是为什么会出现无关日期的原因。咱们直接用Microsoft.TeamFoundation.Discussion.Client来精准获取评论内容和对应的日期,步骤如下:
1. 核心思路
TFS的评论是存储在**讨论线程(DiscussionThread)**里的,每个线程包含多条评论,每条评论都有明确的创建日期。我们需要:
- 初始化讨论管理器(DiscussionManager)连接到TFS服务器
- 根据工作项ID获取对应的讨论线程集合
- 遍历所有评论,提取内容、创建日期,同时记录最早和最新的评论日期
2. 完整代码示例
首先确保你已经引用了Microsoft.TeamFoundation.Client和Microsoft.TeamFoundation.Discussion.Client程序集,然后用以下代码:
using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.Discussion.Client; using System; using System.Collections.Generic; using System.Linq; // 初始化TFS服务器连接 Uri tfsUri = new Uri("http://你的TFS服务器地址:8080/tfs/集合名称"); TfsTeamProjectCollection tfsCollection = new TfsTeamProjectCollection(tfsUri); tfsCollection.EnsureAuthenticated(); // 获取DiscussionManager DiscussionManager discussionManager = tfsCollection.GetService<DiscussionManager>(); // 指定要查询的工作项ID int workItemId = 12345; // 替换成你的工作项ID // 获取该工作项的所有讨论线程 IEnumerable<DiscussionThread> threads = discussionManager.GetDiscussionsByArtifactUris( new[] { new Uri($"vstfs:///WorkItem/WorkItem/{workItemId}") }, QueryStoreOptions.ServerAndLocal); // 存储所有评论信息的列表 List<(string CommentContent, DateTime CreatedDate)> commentsList = new List<(string, DateTime)>(); foreach (var thread in threads) { // 遍历线程里的每条评论 foreach (var comment in thread.Comments) { // 提取评论内容和创建日期 commentsList.Add((comment.Content, comment.CreatedDate)); Console.WriteLine($"评论内容: {comment.Content}"); Console.WriteLine("创建日期: {0:yyyy-MM-dd HH:mm:ss}", comment.CreatedDate); Console.WriteLine("---"); } } // 获取最早和最晚的评论日期 if (commentsList.Any()) { DateTime earliestDate = commentsList.Min(c => c.CreatedDate); DateTime latestDate = commentsList.Max(c => c.CreatedDate); Console.WriteLine($"最早评论日期: {earliestDate:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($"最新评论日期: {latestDate:yyyy-MM-dd HH:mm:ss}"); // 这里可以添加将数据存入数据库的逻辑 // 比如用ADO.NET或者EF Core,把commentsList、earliestDate、latestDate写入对应的表 } else { Console.WriteLine("该工作项没有评论"); }
3. 关键说明
- 为什么不用Revisions?:
WorkItem.Revisions包含了工作项的所有变更操作(比如字段修改、附件添加、状态变更等),而评论是独立的讨论实体,通过Discussion API才能精准获取。 - 评论的日期:每条
Comment的CreatedDate就是评论添加的时间,直接用这个字段就可以,不需要从Revisions里筛选。 - 存入数据库:拿到
commentsList、earliestDate和latestDate后,你可以用熟悉的数据库操作方式(比如SqlConnection执行插入语句,或者EF Core的Add方法)把数据写入对应的表中。
4. 可能遇到的问题
- 如果运行时提示权限不足,确保你的TFS账号有访问该工作项讨论的权限。
- 如果找不到
DiscussionManager,检查是否正确引用了Microsoft.TeamFoundation.Discussion.Client程序集(可以从NuGet安装对应的包)。
内容的提问来源于stack exchange,提问作者Vasuki Hebbar




