代码之家  ›  专栏  ›  技术社区  ›  Robaticus

针对CodePlex项目的QueryHistory无限期挂起

  •  0
  • Robaticus  · 技术社区  · 14 年前

    我正在开发一个tfs实用程序,它可以获取tfs中特定项目的变更集。我有一个主要用于测试的家庭TFS2010服务器,但我决定对我贡献的codeplex项目进行一次尝试。这样,我就可以针对比本地更多的变更集测试功能。

    虽然它在我的环境中工作得很好,但通过电线到codeplex却让我感到难堪。我的应用程序查询历史记录,但是当试图遍历历史记录时(也就是当它懒惰地加载IEnumerable时),我的应用程序挂起。

    在IntelliTrace中,我看到一些“第一次机会”异常,即“项在指定的版本中不存在”——这显然不是真的,因为我正在尝试在versionspec.latest中获取“$/”的历史记录。

    我还看到在强制调试暂停后,有两个或三个连续的服务器500错误返回给我。

    其他操作(如 GetItems() )工作正常,所以我很确定身份验证不是问题。

    有什么想法吗?

    代码如下:

    IEnumerable items = vcs.QueryHistory("$/", VersionSpec.Latest, 1, RecursionType.None, null, null, null, 5, true, false);
    
            List<ChangesetItem> returnList = new List<ChangesetItem>();
            foreach (Changeset cs in items)  //hangs here on first iteraiton
            {
                ChangesetItem newItem = new ChangesetItem()
                {
                    ChangesetId = cs.ChangesetId,
                    //ChangesetNote = cs.CheckinNote.Values[0].Value,
                    Comment = cs.Comment,
                    Committer = cs.Committer,
                    CreationDate = cs.CreationDate
                };
    
                returnList.Add(newItem);
            }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Robaticus    14 年前

    呸!找到它了。问题出在我的queryhistory调用上:

    IEnumerable items = vcs.QueryHistory("$/", 
                      VersionSpec.Latest, 
                      1, // the deletionId should be '0' or a unique deletion identifier
                      RecursionType.None, 
                      null, 
                      null, 
                      null, 
                      5, 
                      true, 
                      false);
    

    我评论了上面的代码行。出于某种原因,我认为deletion id应该是“1”,但是,现在我已经查看了API,我意识到它应该是零(对于现有文件),或者对于已删除的文件的特定删除ID。显然,API正在查找一个delationID为“1”的文件,但找不到该文件,因此导致了崩溃。