2016-12-05 122 views
0

我試圖創建C#代碼,因此我可以自動從Team Foundation Server中下載所有BUG預定義查詢的附件。該代碼似乎工作得很好,但所有下載的文件出於意外的原因損壞,我無法查看它們。有人可以看看代碼並分享意見嗎?非常感謝您的幫助!從TFS下載工作項附件(損壞的文件)

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); 
       } 
      } 
+0

此錯誤是否只發生在您的開發機器上?你可以試試另一臺機器嗎? –

+0

嗨。是的,我的同事機器上的錯誤也完全一樣。我想知道這是否可能是一個身份驗證問題。當正常登錄到VSTS時,我需要使用電話身份驗證+憑證。然而,它很奇怪,因爲代碼能夠獲得所有的附件,但是以損壞的形式。我還發現了以下文章,其中的代碼使用了令牌認證。但它是相反的過程(附件上傳/不下載)。非常感謝您的幫助。 –

+0

試試這個博客的方法http://www.timschaeps.com/team-foundation-service-downloading-attachments-from-work-items-through-the-api/ –

回答

0

這是由Web客戶端造成的不正確驗證TFS服務器。除了使用WebClient下載文件外,您還可以使用方法Microsoft.TeamFoundation.WorkItemTracking.Proxy下載文件。請參閱下面的代碼以獲取詳細信息:

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

      } 
+0

埃迪!感謝一百萬現在完美! –

0

對於驗證,您可以添加以下代碼來驗證項目集合級別。

//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

+0

嗨帕特里克。代碼和鏈接非常感謝。我試過這個,結果是一樣的。所有附件都已損壞,因此無法讀取。我知道,TFS還可以爲第三方應用程序訪問生成「個人訪問令牌」。然而,由於我不是這方面的專家,你有什麼想法,在我的代碼中怎麼可能實現?我幾乎可以肯定,這個問題必須通過無效訪問TFS來完成。我試圖編輯代碼,以便導出所有附件.Uri和每個鏈接都可以通過瀏覽器完全訪問。非常感謝你的幫助! –

+0

如果您希望通過HTTP標頭提供個人訪問令牌,則必須先將其轉換爲Base64字符串(以下示例顯示如何使用C#將其轉換爲Base64)。更多詳情請參閱此鏈接:https://www.visualstudio.com/en-us/docs/integrate/get-started/auth/overview –