Как программно загрузить вложения в Azure DevOps? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь программно загрузить более 90 вложений из пользовательской истории в VSTS, используя TeamFoundation / VisualStudio C # API, который я скачал с Nuget. Я пытался использовать этот пример: https://intellitect.com/downloading-attachments-from-tfs/

Однако этот код, похоже, устарел. Я не могу найти эти точные пакеты, упомянутые в статье: nuget-bot.Microsoft.TeamFoundation.Client NuGet-bot.Microsoft.TeamFoundation.WorkItemTracking.Client

Однако я загрузил пакеты TFS, которые там есть, такие как Microsoft.TeamFoundationServer.Client и Microsoft.TeamFoundationServer.ExtendedClient, но класс WorkItem, похоже, больше не имеет вложений. Кто-нибудь знает, где я могу найти свойство Attachments? Я просмотрел Object Browser в Visual Studio и не могу его найти. Или вы можете предложить альтернативное решение для получения вложений из рабочего элемента? Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

WebClient не может правильно пройти проверку подлинности VSTS. Вместо того, чтобы использовать WebClient для загрузки файла, вы можете использовать WorkItemServer.DownloadFile() метод в Microsoft.TeamFoundation.WorkItemTracking.Proxy чтобы скачать файл. Подробнее см. в этой теме .

Вы можете использовать приведенный ниже пример, чтобы загрузить вложение для определенного рабочего элемента:

Примечание. Установите пакет nuget Microsoft.TeamFoundationServer.ExtendedClient

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Proxy;
using System;
using System.IO;

namespace VSTS_DownloadWITAttachment
{
    class Program
    {
        static void Main(string[] args)
        {
            TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri("https://account.visualstudio.com/"));
            ttpc.EnsureAuthenticated();
            WorkItemStore wistore = ttpc.GetService<WorkItemStore>();
            WorkItem wi = wistore.GetWorkItem(94);
            WorkItemServer wiserver = ttpc.GetService<WorkItemServer>();
            string tmppath = wiserver.DownloadFile(wi.Attachments[0].Id); //Change the number to download other attachments if there are more then one attachments for the specific work item. e.g: [1] to download the second one.
            string filename = string.Format("D:\\WITAttachments\\{0}-{1}", wi.Fields["ID"].Value, wi.Attachments[0].Name);
            File.Copy(tmppath, filename);
        }
    }
}

Затем вы можете попытаться запросить рабочие элементы и загрузить вложения в цикле для каждого из них. Подробнее см. Выборка рабочих элементов с запросами в VSTS .

Ниже образец для справки:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Proxy;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi.Models;
using Microsoft.VisualStudio.Services.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;

namespace DownloadWITAttachments
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("https://account.visualstudio.com");
            string PAT = "xxxxxxxxxxxx";
            string project = "ProjectName";

            VssBasicCredential credentials = new VssBasicCredential("", PAT);

            //create a wiql object and build our query
            Wiql wiql = new Wiql()
            {
                Query = "Select * " +
                        "From WorkItems " +
                        "Where [Work Item Type] = 'User Story' " +
                        "And [System.TeamProject] = '" + project + "' " +
                        "And [System.State] <> 'Closed' " +
                        "And [System.AttachedFileCount] > 0 " +
                        "Order By [State] Asc, [Changed Date] Desc"
            };

            //create instance of work item tracking http client
            using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, credentials))
            {
                //execute the query to get the list of work items in the results
                WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result;

                if (workItemQueryResult.WorkItems.Count() != 0)
                {
                    //Download the first attachment for each work item.
                    foreach (var item in workItemQueryResult.WorkItems)
                    {
                        TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(uri);
                        ttpc.EnsureAuthenticated();
                        WorkItemStore wistore = ttpc.GetService<WorkItemStore>();
                        Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItem wi = wistore.GetWorkItem(item.Id);
                        WorkItemServer wiserver = ttpc.GetService<WorkItemServer>();                       
                        string tmppath = wiserver.DownloadFile(wi.Attachments[0].Id);
                        string filename = string.Format("D:\\temp\\vsts\\{0}-{1}", wi.Fields["ID"].Value, wi.Attachments[0].Name);
                        File.Copy(tmppath, filename);
                    }
                }
            }
        }
    }
}
0 голосов
/ 01 мая 2018

Если у вас еще нет токена доступа для взаимодействия с API, создайте его.

Выполните вызов API, чтобы получить расширенную информацию о рабочем элементе. Обратите внимание на параметр $expand=all для получения всех сведений об элементе.

GET https://{account}.visualstudio.com/{project}/_apis/wit/workitems/115258?api-version=4.1&$expand=all

Ответ должен выглядеть примерно так (если элемент имеет вложения).

{
    "id": 115258,
    "rev": 4,
    "fields": {
        "System.Id": 115258,
        "System.AreaId": 2643
        ...and so on...
    },
    "relations": [
        {
            "rel": "AttachedFile",
            "url": "https://{account}.visualstudio.com/d6c4b828-0f7e-4b69-a356-a92c0ec3cd07/_apis/wit/attachments/5682f031-4b09-478c-8042-0d2a998905e4",
            "attributes": {
                "authorizedDate": "2018-04-30T19:34:09.763Z",
                "id": 2015371,
                "resourceCreatedDate": "2018-04-30T19:34:07.873Z",
                "resourceModifiedDate": "2018-04-30T19:32:16.057Z",
                "revisedDate": "9999-01-01T00:00:00Z",
                "resourceSize": 47104,
                "name": "file.jpg"
            }
        }
    ]
}

Выполните итерацию по relations, где rel равно AttachedFile, и вызовите url, чтобы получить содержимое вложения.

GET https://{account}.visualstudio.com/d6c4b828-0f7e-4b69-a356-a92c0ec3cd07/_apis/wit/attachments/5682f031-4b09-478c-8042-0d2a998905e4

Источники:

...