【问题标题】:Download workitem attachments from TFS (files corrupted)从 TFS 下载工作项附件(文件已损坏)
【发布时间】:2021-05-28 14:19:20
【问题描述】:

我正在尝试创建 C# 代码,因此我可以从 Team Foundation Server 自动下载所有附件以进行预定义的 BUGS 查询。该代码似乎运行良好,但所有下载的文件都因意外原因损坏,我无法查看它们。有人可以看看代码并分享意见吗?非常感谢您的帮助!

static void Main()
        {
            // Connection to the Team Project Collection
            TfsTeamProjectCollection tpc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
              new Uri("https://xxx.visualstudio.com/defaultcollection"));

            // Get a WorkItemStore object for the Team Project Collection.
            WorkItemStore workItemStore = new WorkItemStore(tpc);

            // Run a query.
            WorkItemCollection queryResults = workItemStore.Query(
              @"SELECT *
    FROM WorkItems
    WHERE [System.WorkItemType] = 'Bug'
    AND [Language] = 'xxx'
    AND [How Found] = 'xxx'
    AND [Assigned to] = 'xxx'
    ORDER BY [Changed Date] DESC");

            // Get a WebClient object to do the attachment download
            WebClient webClient = new WebClient()
            {
                UseDefaultCredentials = true
            };

            // Loop through each work item.
            foreach (WorkItem workItem in queryResults)
            {
                // Loop through each attachment in the work item.
                foreach (Attachment attachment in workItem.Attachments)
                {
                    // Construct a filename for the attachment
                    string filename = string.Format("C:\\TEST\\{0}_{1}", workItem.Fields["ID"].Value, attachment.Name);
                    // Download the attachment.
                    webClient.DownloadFile(attachment.Uri, filename);
                }
            }

【问题讨论】:

  • 这个错误只发生在你的开发机器上吗?你能在另一台机器上试一试吗?
  • 嗨。是的,我同事机器上的错误也完全相同。我想知道这是否可能是身份验证问题。正常登录 VSTS 时,我需要使用电话身份验证 + 凭据。然而奇怪的是,代码能够获取所有附件,但形式已损坏。我还找到了以下文章,其中代码使用令牌身份验证。但这是针对相反的过程(附件上传/不下载)。非常感谢您的帮助。
  • 试试这个博客里的方法timschaeps.com/…

标签: c# tfs


【解决方案1】:

这是由于 WebClient 未正确向 TFS 服务器进行身份验证造成的。您可以使用Microsoft.TeamFoundation.WorkItemTracking.Proxy中的WorkItemServer.DownloadFile()方法下载文件,而不是使用WebClient下载文件。详情参考以下代码:

foreach (Attachment atm in workItem.Attachments)
            {
                WorkItemServer wise = tpc.GetService<WorkItemServer>();
                string file = wise.DownloadFile(atm.Id);
                File.Copy(file,"C:\\TEST\\" + atm.Name,true);

            }

【讨论】:

    【解决方案2】:

    对于身份验证,您可以添加以下代码来验证项目集合级别。

    //get credentials by logging in with a user interface
    var credentialsProvider = new UICredentialsProvider();
    
    var teamProjectCollection = new TfsTeamProjectCollection(collection, credentialsProvider);
    teamProjectCollection.Authenticate();
    

    更多详情请参考此博客:Team Foundation Service: Downloading attachments from work items through the api

    【讨论】:

    • 嗨帕特里克。非常感谢代码和链接。我试过这个,结果是一样的。所有附件都已损坏,因此无法读取。我知道,TFS 还可以生成“个人访问令牌”供第三方应用程序访问。然而,由于我不是这方面的专家,你有什么想法,这怎么可能在我的代码中实现?我几乎可以肯定,问题与对 TFS 的无效访问有关。我尝试编辑代码,以便导出所有附件。Uri 并且每个链接都可以通过浏览器完全访问。非常感谢您的帮助!
    • 如果您希望通过 HTTP 标头提供个人访问令牌,您必须首先将其转换为 Base64 字符串(以下示例显示如何使用 C# 转换为 Base64)。更多详情请参考此链接:visualstudio.com/en-us/docs/integrate/get-started/auth/overview
    【解决方案3】:

    文件没有损坏,下载的附件是 zip 格式的。您可以检查“损坏的文件”的大小。它会变小。因此,在下载时,您将文件名设置为 =====> 文件名+“.zip” ===>当您提取并查看它时,这将为我们提供正确的文件。

    示例。

    1. Dummy.docx ==> 源文件 ===> 290kb
    2. Dummy.docx ==> 文件在 目标 ===> 280kb ==> 无法打开此文件

    解决方案。

    1. Dummy.docx.zip ===> 提取文件将提供 Dummy.docx (290 kb)==> 可以打开它并查看数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多