从TFS获取当前迭代路径

我正在尝试获取团队TFS项目的当前迭代路径。 我试图这样做的方法是使用http://blog.johnsworkshop.net/tfs11-api-reading-the-team-configuration-iterations-and-areas/上的博客。 我首先从以下代码获取团队配置:

TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url"); var configSvc = tpc.GetService(); var configs = configSvc.GetTeamConfigurationsForUser(projectUri); 

这个问题是我的配置总是空的,即使我是团队成员。 我很肯定我的项目URI也是正确的。 在此之后,我将获得团队设置并使用它来显示当前的迭代路径。

 TeamSettings ts = config.TeamSettings; Console.WriteLine(ts.CurrentIterationPath); 

即使这不起作用,我仍然可以从团队设置中查询迭代日期,以获得具有今天之前的开始日期和今天之后的完成日期的一次迭代。 主要的问题是当我尝试使用我的项目URI获取团队配置时,我无法让我的TeamSettingsConfigurationService返回任何空值。

您的服务器连接或您传递的项目必定存在问题,因为其他代码看起来没问题。

也许尝试这样的事情:

 TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/collection"), new System.Net.NetworkCredential(tfsUserName, tfsPassword)); tpc.EnsureAuthenticated(); 

从控制台应用程序连接到Team Foundation Server

这里有一个很好的示例,您可以下载(WPF客户端),它将允许您选择服务器连接,团队项目和团队:

TFS API第46部分(VS11) – 团队设置

您可以单步执行它并检查您传递给代码的值。

示例获取团队配置信息的方式与代码中的相同。

 TeamSettingsConfigurationService teamConfig = tfs.GetService(); var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri }); 

获得TeamConfiguration项目后,您需要TeamSettings.CurrentIterationPath

我实际上没有使用TeamSettingsConfigurationService就得到了答案。 我是这样做的:

  private static XmlNode currentIterationNode; TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url"); ICommonStructureService4 css = tpc.GetService();; WorkItemStore workItemStore = new WorkItemStore(tpc); foreach (Project teamProject in workItemStore.Projects) { if (teamProject.Name.Equals("TeamProjectNameGoesHere")) { NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString()); NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle")); if (iterations != null) { XmlElement iterationsTree = css.GetNodesXml(new[] { iterations.Uri }, true); XmlNodeList nodeList = iterationsTree.ChildNodes; currentIterationNode = FindCurrentIteration(nodeList); String currentIterationPath = currentIterationNode.Attributes["Path"].Value; } } } 

其中currentIterationPath是来自TFS的当前迭代路径。 这样做的关键是从我从chamindacNavantis获得的这两行代码获取NodeInfo []数组结构和NodeInfo迭代https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b785ae7 -66c0-47ee-a6d2-c0ad8a3bd420 / tfs-get-iteration-dates-metadata?forum = tfsgeneral :

  NodeInfo[] structures = css.ListStructures(teamProject.Uri.ToString()); NodeInfo iterations = structures.FirstOrDefault(n => n.StructureType.Equals("ProjectLifecycle")); 

之后,我在团队项目中创建了一个包含每次迭代节点的xml。 这些节点还具有每次迭代的开始日期和结束日期。 所以我在DateTime.Now之前检查每个节点的开始日期,并在DateTime.Now之后完成日期,这是FindCurrentIteration(nodeList)所做的全部。 这将为您提供当前的迭代节点。

我发现这样做的最简单方法是使用ICommonStructureService4TeamSettingsConfigurationService方法:

 static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory .GetTeamProjectCollection("") (...) static string GetCurrentIterationPath() { var css = _tfs.GetService(); var teamProjectName = ""; var project = css.GetProjectFromName(teamProjectName); var teamName = ""; var teamSettingsStore = _tfs.GetService(); var settings = teamSettingsStore .GetTeamConfigurationsForUser(new[] { project.Uri }) .Where(c => c.TeamName == teamName) .FirstOrDefault(); if (settings == null) { var currentUser = System.Threading.Thread.CurrentPrincipal.Identity.Name; throw new InvalidOperationException( $"User '{currentUser}' doesn't have access to '{teamName}' team project."); } return settings.TeamSettings.CurrentIterationPath; }