C# 从TFS获取当前迭代路径

C# 从TFS获取当前迭代路径,c#,.net,tfs,tfs-sdk,C#,.net,Tfs,Tfs Sdk,我正在尝试获取团队TFS项目的当前迭代路径。我尝试这样做的方式是使用来自的博客。我首先从以下代码获取团队配置: TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url"); var configSvc = tpc.GetService<TeamSettingsConfigurationService>(); var configs = configSvc.GetTeam

我正在尝试获取团队TFS项目的当前迭代路径。我尝试这样做的方式是使用来自的博客。我首先从以下代码获取团队配置:

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

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

您的服务器连接或传递的项目uri一定有问题,因为其他代码看起来没有问题

也许可以试试这样:

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

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

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

TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
    var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });
该示例获取团队配置信息的方式与代码中的方式相同

TeamSettingsConfigurationService teamConfig = tfs.GetService<TeamSettingsConfigurationService>();
    var configs = teamConfig.GetTeamConfigurationsForUser(new[] { projectInfo.Uri });
teamSettingsConfiguration服务teamConfig=tfs.GetService();
var configs=teamConfig.getteamconfigurationsfourser(新[]{projectInfo.Uri});

一旦你收集了
TeamConfiguration
项,你就需要
TeamSettings.CurrentIterationPath

我实际上自己没有使用TeamSettings配置服务就得到了答案。我是这样做的:

    private static XmlNode currentIterationNode;
    TfsTeamProjectCollection tpc = TFSConncetion(@"http://tfs/url");

    ICommonStructureService4 css = tpc.GetService<ICommonStructureService4>();;
    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;
                }
            }
        }
之后,我创建了一个xml,其中包含团队项目中每个迭代的节点。这些节点还具有每个迭代的开始日期和结束日期。所以我检查了每个节点的开始日期是否早于DateTime。现在和结束日期是否晚于DateTime。现在,这就是FindCurrentIteration(nodeList)所做的。
这将为您提供当前迭代节点

我发现最简单的方法是使用
ICommonStructureService4
TeamSettingsConfigurationService
方法:

static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory
    .GetTeamProjectCollection("<tfsUri>")

(...)

static string GetCurrentIterationPath()
{
    var css = _tfs.GetService<ICommonStructureService4>();

    var teamProjectName = "<teamProjectName>";
    var project = css.GetProjectFromName(teamProjectName);

    var teamName = "<teamName>";
    var teamSettingsStore = _tfs.GetService<TeamSettingsConfigurationService>();

    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;
}
static tfstreamprojectcollection\u tfs=tfstreamprojectcollectionfactory
.GetTeamProjectCollection(“”)
(...)
静态字符串GetCurrentIterationPath()
{
var css=_tfs.GetService();
var teamProjectName=“”;
var project=css.GetProjectFromName(teamProjectName);
var teamName=“”;
var teamsetingsstore=_tfs.GetService();
var设置=团队设置存储
.getteamconfigurationsfourser(新[]{project.Uri})
.其中(c=>c.TeamName==TeamName)
.FirstOrDefault();
如果(设置==null)
{
var currentUser=System.Threading.Thread.CurrentPrincipal.Identity.Name;
抛出新的InvalidOperationException(
$“用户“{currentUser}”无权访问“{teamName}”团队项目。”);
}
返回settings.TeamSettings.CurrentIterationPath;
}

我同意@rerwinRR的说法,我的项目uri可能有问题,但我实际上是在使用Shai Raiten的博客来交叉检查uri的值。我肯定我的服务器连接正常。我确实找到了一种不使用TeamSettingsConfiguration服务的方法,并发布了解决方案。我不知道您在哪里使用了
WebClient
。该WebClient后来在代码中用于使用当前迭代路径从TFS下载图像。在这个问题上,我现在明白这是没有必要的
static TfsTeamProjectCollection _tfs = TfsTeamProjectCollectionFactory
    .GetTeamProjectCollection("<tfsUri>")

(...)

static string GetCurrentIterationPath()
{
    var css = _tfs.GetService<ICommonStructureService4>();

    var teamProjectName = "<teamProjectName>";
    var project = css.GetProjectFromName(teamProjectName);

    var teamName = "<teamName>";
    var teamSettingsStore = _tfs.GetService<TeamSettingsConfigurationService>();

    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;
}