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