C# 通过API在团队服务中创建工作项

C# 通过API在团队服务中创建工作项,c#,visual-studio,azure,azure-devops,azure-devops-rest-api,C#,Visual Studio,Azure,Azure Devops,Azure Devops Rest Api,我正在尝试创建一个web应用程序(托管在Azure上),以便客户端能够将工作项提交到我们的团队服务页面。基本上是一个支持标签页,这样他们就不必一直打电话解释他们的积压工作 下面是我创建工作项的类和方法,遵循Microsoft的示例代码,出于隐私原因进行了一些明显的更改。此方法是通过单击按钮触发的,到目前为止,我无法让它创建任何工作项 using System; using System.Net.Http; using System.Net.Http.Headers; using System.T

我正在尝试创建一个web应用程序(托管在Azure上),以便客户端能够将工作项提交到我们的团队服务页面。基本上是一个支持标签页,这样他们就不必一直打电话解释他们的积压工作

下面是我创建工作项的类和方法,遵循Microsoft的示例代码,出于隐私原因进行了一些明显的更改。此方法是通过单击按钮触发的,到目前为止,我无法让它创建任何工作项

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;

 namespace customapp
 {
  public class CreateWorkItem
  {


    public void CreateWorkItemMethod()
    {

        string personalAccessToken = "xxxxxxxxx";
        string credentials = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "xxx", personalAccessToken)));

        Object[] patchDocument = new Object[1];

        patchDocument[0] = new { op = "add", path = "/fields/System.Title", value = "Test" };


        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);


            var patchValue = new StringContent(JsonConvert.SerializeObject(patchDocument), Encoding.UTF8, "application/json-patch+json");

            var method = new HttpMethod("PATCH");
            var request = new HttpRequestMessage(method, "https://example.visualstudio.com/exampleproject/_apis/wit/workitems/$Support&20Ticket?api-version=1.0") { Content = patchValue };
            var response = client.SendAsync(request).Result;


            if (response.IsSuccessStatusCode)
            {
               var result = response.Content.ReadAsStringAsync().Result;

            }

 }}}} 

在补丁的url中,我使用团队项目的ID(代替下面看到的/exampleproject)。我们的网站设置为有一个整体项目,我们称之为“主项目”,内部是每个客户的团队项目,例如“ClientProject”。因此,基本上我想在Master->ClientProject->Backlog/Board中创建一个“支持票证”工作项。

使用
Master\\areapath
(而不是
Master\areapath

样本体:

[
  {
    "op": "add",
    "path": "/fields/System.Title",
    "value": "PBIAPI2"
  },
  {
    "op": "add",
    "path": "/fields/System.AreaPath",
    "value": "Scrum2015\\SharedArea"
  }
]
另一方面,最好使用VSTS/TFSAPI创建工作项

简单示例代码:

var u = new Uri("https://[account].visualstudio.com");
            VssCredentials c = new VssCredentials(new Microsoft.VisualStudio.Services.Common.VssBasicCredential(string.Empty, "[personal access token]"));
           var connection = new VssConnection(u, c);

var workitemClient = connection.GetClient<WorkItemTrackingHttpClient>();
var workitemtype = "Product Backlog Item";
            string teamProjectName = "Scrum2015";
            var document = new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchDocument();
            document.Add(
    new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
    {
        Path = "/fields/Microsoft.VSTS.Common.Discipline",
        Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
        Value = "development"
    });
            document.Add(
                new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
                {
                    Path = "/fields/System.Title",
                    Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
                    Value = string.Format("{0} {1}", "RESTAPI", 6)
                });
            document.Add(new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
            {
                Path = "/fields/System.AreaPath",
                Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
                Value =string.Format("{0}\\{1}",teamProjectName, "SharedArea")
            });
            document.Add(
                new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
                {
                    Path = "/fields/System.AssignedTo",
                    Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
                    Value = "[user account]"
                });
            document.Add(
                new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
                {
                    Path = "/fields/System.Description",
                    Operation = Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
                    Value = "destest"
                });
var workitem= workitemClient.CreateWorkItemAsync(document, teamProjectName, workitemtype).Result;
var u=新Uri(“https://[account].visualstudio.com”);
VssCredentials c=新的VssCredentials(新的Microsoft.VisualStudio.Services.Common.VSSBasiccredentials(string.Empty,“[personal access token]”);
var连接=新VSS连接(u,c);
var workitemClient=connection.GetClient();
var workitemtype=“产品待办事项”;
字符串teamProjectName=“Scrum2015”;
var document=new Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchDocument();
文件。添加(
新的Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()文件
{
Path=“/fields/Microsoft.VSTS.Common.prodiction”,
Operation=Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
Value=“开发”
});
文件。添加(
新的Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()文件
{
Path=“/fields/System.Title”,
Operation=Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
Value=string.Format(“{0}{1}”,“RESTAPI”,6)
});
document.Add(新的Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()
{
Path=“/fields/System.AreaPath”,
Operation=Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
Value=string.Format(“{0}\\{1}”,teamProjectName,“SharedArea”)
});
文件。添加(
新的Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()文件
{
Path=“/fields/System.AssignedTo”,
Operation=Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
Value=“[用户帐户]”
});
文件。添加(
新的Microsoft.VisualStudio.Services.WebApi.Patch.Json.JsonPatchOperation()文件
{
Path=“/fields/System.Description”,
Operation=Microsoft.VisualStudio.Services.WebApi.Patch.Operation.Add,
Value=“destest”
});
var workitem=workitemClient.createworkitemsync(文档、teamProjectName、workitemtype);

方法必须是POST,并且使用Api tfs的Uri正确为:

{organization}/{proyect}/_-api/wit/workitems/${type}?api版本=5.0

办理登机手续:

我的下一个代码函数

 static void Main(string[] args)
    {
        CreateWorkItem();
    }


    public static void CreateWorkItem()
    {
        string _tokenAccess = "************"; //Click in security and get Token and give full access https://azure.microsoft.com/en-us/services/devops/
        string type = "Bug";
        string organization = "type your organization";
        string proyect = "type your proyect";
        string _UrlServiceCreate = $"https://dev.azure.com/{organization}/{proyect}/_apis/wit/workitems/${type}?api-version=5.0";
        dynamic WorkItem = new List<dynamic>() {
                new
                {
                    op = "add",
                    path = "/fields/System.Title",
                    value = "Sample Bug test"
                }
            };

        var WorkItemValue = new StringContent(JsonConvert.SerializeObject(WorkItem), Encoding.UTF8, "application/json-patch+json");
        var JsonResultWorkItemCreated = HttpPost(_UrlServiceCreate, _tokenAccess, WorkItemValue);
    }


    public static string HttpPost(string urlService, string token, StringContent postValue)
    {
        try
        {
            string request = string.Empty;
            using (HttpClient httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.Accept.Clear();
                httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", token))));
                using (HttpRequestMessage httpRequestMessage = new HttpRequestMessage(new HttpMethod("POST"), urlService) { Content = postValue })
                {
                    var httpResponseMessage = httpClient.SendAsync(httpRequestMessage).Result;
                    if (httpResponseMessage.IsSuccessStatusCode)
                        request = httpResponseMessage.Content.ReadAsStringAsync().Result;
                }
            }
            return request;
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
    }
static void Main(字符串[]args)
{
CreateWorkItem();
}
公共静态无效CreateWorkItem()
{
string_tokenAccess=“**********”;//单击安全性并获取令牌并授予完全访问权限https://azure.microsoft.com/en-us/services/devops/
string type=“Bug”;
string organization=“键入您的组织”;
string proyect=“键入您的项目”;
字符串_UrlServiceCreate=$”https://dev.azure.com/{organization}/{proyect}/_-api/wit/workitems/${type}?api版本=5.0”;
动态工作项=新列表(){
新的
{
op=“添加”,
path=“/fields/System.Title”,
value=“示例错误测试”
}
};
var WorkItemValue=newstringcontent(JsonConvert.SerializeObject(WorkItem),Encoding.UTF8,“application/json patch+json”);
var JsonResultWorkItemCreated=HttpPost(_UrlServiceCreate,_tokenAccess,WorkItemValue);
}
公共静态字符串HttpPost(字符串urlService、字符串令牌、字符串内容postValue)
{
尝试
{
字符串请求=string.Empty;
使用(HttpClient HttpClient=new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
httpClient.DefaultRequestHeaders.Authorization=new AuthenticationHeaderValue(“Basic”,Convert.ToBase64String(ascienceoding.ASCII.GetBytes(string.Format(“{0}:{1},”“,token)));
使用(HttpRequestMessage HttpRequestMessage=newHttpRequestMessage(newHttpMethod(“POST”),urlService){Content=postValue})
{
var httpResponseMessage=httpClient.SendAsync(httpRequestMessage).Result;
if(httpResponseMessage.IsSuccessStatusCode)
request=httpResponseMessage.Content.ReadAsStringAsync().Result;
}
}
返回请求;
}
捕获(例外情况除外)
{
抛出新异常(例如消息);
}
}

您遇到的错误是什么?您能提供相关信息吗?似乎是错误所在。在HttpRequestMe中