TFS的二次开发中,调用VersionControlServer.ArtifactProvider.GetChangeset()方法异常

靓风有信 2015-08-14 10:41:09
对TFS进行二次开发,想做一个通过输入WorkItem列表,然后得到这些WorkItem的ChangeSet列表。
UI如下:

但在调用TFS的函数的过程中,发现在调用VersionControlServer.ArtifactProvider.GetChangeset()时,
如果WorkItem数量比较多,特别是某个WorkItem的ChangeSet又很多的时候,经常都会出现异常,异常信息如下:
Team Foundation Server vstfs:///VersionControl/Changeset/135900 does not exist or is not accessible at this time.
Technical information (for administrator):
The operation has timed out

不知道哪位有没有遇到类似的问题,怎么解啊?
出现这种异常的原因有可能是哪种原因造成的?
期待有大婶帮忙,这个问题,困扰了我好几个月了。

环境:
TFS Server为TFS2008
现在程式引用的TFS DLL的版本为11.

关键代码如下:

private void btnAddWI_Click(object sender, EventArgs e)
{
try
{
Boolean ReBindCS = false;
ReBindCS = (lstWorkItem.Items.Count > 0 ? false : true);
if (txtWorkItems.Text.Trim() != "")
{
TfsTeamProjectCollection tfsTPC = new TfsTeamProjectCollection(new Uri(appContext.ServerURL), new TfsClientCredentials(new SimpleWebTokenCredential(appContext.UserName, appContext.Password)));
WorkItemStore wis = tfsTPC.GetService<WorkItemStore>();
VersionControlServer vcs = tfsTPC.GetService<VersionControlServer>();
txtWorkItems.Text = txtWorkItems.Text.Trim().Replace(",", ",");
string[] strWIs = txtWorkItems.Text.Trim().Split(',');
string strMsg = string.Empty;
foreach (string strWI in strWIs)
{
//TfsTeamProjectCollection tfsTPC = new TfsTeamProjectCollection(new Uri(appContext.ServerURL), new TfsClientCredentials(new SimpleWebTokenCredential(appContext.UserName, appContext.Password)));
//WorkItemStore wis = tfsTPC.GetService<WorkItemStore>();
//VersionControlServer vcs = tfsTPC.GetService<VersionControlServer>();
int intWI = 0;
string strSA = string.Empty;
string strHasSQL = string.Empty;
if (int.TryParse(strWI, out intWI))
{
try
{
WorkItem wi = wis.GetWorkItem(intWI);
if (wi != null)
{
if (wi.Fields.Contains("Include SQL Script"))
strHasSQL = wi.Fields["Include SQL Script"].Value.ToString();
else
strHasSQL = "No";
if (wi.Fields.Contains("SA"))
strSA = wi.Fields["SA"].Value.ToString();
else
strSA = "N/A";
BSWorkItem bsWI = new BSWorkItem();
bsWI.WorkItemID = strWI;
bsWI.Description = wi.Title;
bsWI.HasSQL = strHasSQL;
bsWI.SA = strSA;
if (appContext.BuildWorkItems == null)
{
appContext.BuildWorkItems = new List<BSWorkItem>();
}
ListViewItem lvi = lstWorkItem.Items.Add(strWI);
lvi.SubItems.Add(strHasSQL);
lvi.SubItems.Add(wi.Title);
lvi.SubItems.Add(strSA);
lvi.EnsureVisible();

if (bsWI.Changesets == null)
{
bsWI.Changesets = new List<BSChangeset>();
}
Common.WriteLog("---------------------------------------------------");
Common.WriteLog("[WI:" + wi.Id + "]");
foreach (Link lnk in wi.Links)
{
Common.WriteLog(" ----------------------------------------------");
Common.WriteLog(" [LK:" + lnk.Comment + "]");
ExternalLink elk = (ExternalLink)lnk;
Common.WriteLog(" [URL:" + elk.LinkedArtifactUri + "]");
Stopwatch sw = new Stopwatch();
sw.Start();
//TfsTeamProjectCollection tfsTPC2 = new TfsTeamProjectCollection(new Uri(appContext.ServerURL), new TfsClientCredentials(new SimpleWebTokenCredential(appContext.UserName, appContext.Password)));
//VersionControlServer vcs2 = tfsTPC2.GetService<VersionControlServer>();
Changeset cs = vcs.ArtifactProvider.GetChangeset(new Uri(elk.LinkedArtifactUri));
sw.Stop();
Common.WriteLog(" [TM:" + sw.Elapsed.ToString() + "]");
Common.WriteLog(" [CS:" + cs.ChangesetId.ToString() + "]");
foreach (Change cg in cs.Changes)
{
Common.WriteLog(" ----------------------------------------------");
Common.WriteLog(" [File:" + cg.Item.ArtifactUri + "]");
BSChangeset bcs = new BSChangeset();
bcs.ChangesetID = cs.ChangesetId.ToString();
bcs.FileName = cg.Item.ServerItem.ToString();
bcs.FileSaveMode = cg.ChangeType;
bsWI.Changesets.Add(bcs);
}
}
//foreach (var changeset in wi.Links.OfType<ExternalLink>().Select(link => vcs.ArtifactProvider.GetChangeset(new Uri(link.LinkedArtifactUri))))
//{

// Common.WriteLog(" [CS:" + changeset.ChangesetId.ToString() + "]");
// foreach (Change cg in changeset.Changes)
// {
// Common.WriteLog(" [File:" + cg.Item.ArtifactUri + "]");
// BSChangeset cs = new BSChangeset();
// cs.ChangesetID = changeset.ChangesetId.ToString();
// cs.FileName = cg.Item.ServerItem.ToString();
// cs.FileSaveMode = cg.ChangeType;
// bsWI.Changesets.Add(cs);
// }
//}
appContext.BuildWorkItems.Add(bsWI);
}
else
{
strMsg += (strMsg == "" ? "" : ",") + strWI;
}
}
catch (Exception exWI)
{
MessageBox.Show(exWI.Message);
strMsg += (strMsg == "" ? "" : ",") + strWI;
//throw;
}
}
}
if (ReBindCS)
lstWorkItem.Items[0].Selected = true;
//if (ReBindCS)
// lstWorkItem_SelectedIndexChanged(sender, e);
txtWorkItems.Text = "";
//TF26198: The work item does not exist, or you do not have permission to access it.
if (strMsg != "")
{
MessageBox.Show("The work item:" + strMsg + " does not exist, or you do not have permission to access it.");
}
}
}
catch (Exception exAll)
{

MessageBox.Show(exAll.Message);
}

}
...全文
450 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
靓风有信 2015-09-09
  • 打赏
  • 举报
回复
懂的人到哪去了?
Re:  FastDFS 分布式文件系统部署 ============================== FastDFS 分布式存储主要功能有:文件存储,文件同步,文件访问(文件上传/下载),特别适合以文件为载体的在线服务,如图片网站,视频网站等 它的存储特点是对文件体积小或超小,同时文件的数量特别多的存储情况支持较好,(如果是大文件的存储就推荐使用 Glusterfs 分布式网络文件存储),所谓的小文件就是指网站的图片,文档或者小视频等等,体积范围在4K~500MB之间。所谓的大文件指软件的镜像包、电影等等。 除了FastDFS存储文件特点之外,它同时具备自我负载均衡的能力,可以解决了运维自动化的关键问题。 # 块存储、文件存储、对象存储这三者的本质差别是什么? 1)块存储:磁盘阵列,硬盘(块存储主要是将裸磁盘空间整个映射给主机使用的) 2)文件存储:FTP、NFS服务器(解决文件无法共享的问题) 3)对象存储:内置大容量硬盘的分布式服务器(解决容量、性能、可靠性等问题) 多台服务器内置大容量硬盘,再装上对象存储软件, 然后再额外搞几台服务作为管理节点,安装上对象存储管理软件。 # gluterfs主要运行场景: 存储大文件,针对小文件或超小文件的支持比较差 KVM镜像 视频文件 # FastDFS主要运行场景: 存放文件size范围:4K~500MB # 对象存储 - GlusterFS、Ceph、FastDFS(非对象存储) 必备技能:DRBD/NFS/MooseFS/ GlusterFS/ FastDFS/TFS(http://tfs.taobao.org/)/ # 访问客户端:只能专用API访问实现 存放单元文件size范围:4K~500MB(阅读、声音、视频网站) # 典型用户:      ... ... 

1,265

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 管理版
社区管理员
  • 研发管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧