在 Microsoft Team Foundation Server 2018 中通过 API 从模板创建任务

Create task from template via API in Microsoft Team Foundation Server 2018

我正在使用 C# 创建从我们的测试框架 (Selenium) 到 Team Foundation Server (TFS) 2018 的集成(我们的测试已经写入其中)- 集成将根据测试结果在 TFS 中生成工作项.我想从模板创建工作项,但我似乎找不到任何相关文档。我正在使用 Microsoft 发现的 TFS 客户端库 here.

我可以从 TFS 中提取模板:

var client = new HttpClient()
// Client auth stuff removed
var method = new HttpMethod("GET");
var httpRequestMessage = new HttpRequestMessage(method, "http://server:port/tfs/collection/team/project/_api/wit/templates/12345abc");
var httpResponseMessage = client.SendAsync(httpRequestMessage).Result;
WorkItemTemplate tfs_template = httpResponseMessage.Content.ReadAsAsync<WorkItemTemplate>().Result;

用于创建新工作项 here 的 API 看起来相当简单,但我找不到任何方法来连接这两个操作,也找不到使用此调用应用模板的方法。是否可以通过 API 使用模板创建工作项,如果可以,是否有相关文档?

您无法从工作项模板创建工作项。您可以使用工作项模板来查看哪些字段包含一些默认值。此示例用于来自带有 rest api:

的模板的新工作项
        using Microsoft.TeamFoundation.Core.WebApi;
        using Microsoft.TeamFoundation.Core.WebApi.Types;
        using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
        using Microsoft.VisualStudio.Services.Common;
        using Microsoft.VisualStudio.Services.WebApi;
        using Microsoft.VisualStudio.Services.WebApi.Patch;
        using Microsoft.VisualStudio.Services.WebApi.Patch.Json;
        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;

        namespace ConsoleApp1
        {
            class Program
            {
                static string ServiceURL = "https://your_name.visualstudio.com";
                static string PAT = "your pat";
                static void Main(string[] args)
                {
                    string projectName = "your project";
                    string templateName = "Critical bug";

                    /*connect to service. I use VSTS. In your case: 
                    VssConnection connection = new VssConnection(new Uri(ServiceURL), new VssCredential());
                    https://docs.microsoft.com/ru-ru/azure/devops/integrate/get-started/client-libraries/samples?view=vsts
                    */

                    VssConnection connection = new VssConnection(new Uri(ServiceURL), new VssBasicCredential(string.Empty, PAT));
                    //get clients
                    var WitClient = connection.GetClient<WorkItemTrackingHttpClient>();
                    var ProjectClient = connection.GetClient<ProjectHttpClient>();

                    var project = ProjectClient.GetProject(projectName).Result;

                    //get context for default project team
                    TeamContext tmcntx = new TeamContext(project.Id, project.DefaultTeam.Id);

                    //get all template for team
                    var templates = WitClient.GetTemplatesAsync(tmcntx).Result;

                    //get tempate through its name
                    var id = (from tm in templates where tm.Name == templateName select tm.Id).FirstOrDefault();

                    if (id != null)
                    {
                        var template = WitClient.GetTemplateAsync(tmcntx, id).Result;

                        JsonPatchDocument patchDocument = new JsonPatchDocument();

                        foreach (var key in template.Fields.Keys) //set default fields from template
                            patchDocument.Add(new JsonPatchOperation()
                            {

                                Operation = Operation.Add,
                                Path = "/fields/" + key,
                                Value = template.Fields[key]

                            });

                        //add any additional fields
                        patchDocument.Add(new JsonPatchOperation()
                        {

                            Operation = Operation.Add,
                            Path = "/fields/System.Title",
                            Value = "My critical bug"

                        });

                        var newWorkItem = WitClient.CreateWorkItemAsync(patchDocument, projectName, template.WorkItemTypeName).Result;
                    }            

                }
            }
        }

我的模板: