更新时间:2022-06-18 23:46:30
这是我使用的代码.这是为.net 3.5设计的,但是我找到了.net 4.5.1的解决方案:
Here is the code that I've used. This is made for .net 3.5 but I found solutions with .net 4.5.1:
private const string PROJECT_TEMPLATE_AGILE = "adcc42ab-9882-485e-a3ed-7678f01f66bc";
private const string PROJECT_TEMPLATE_SCRUM = "6b724908-ef14-45cf-84f8-768b5384da45";
private const string PROJECT_TEMPLATE_CMMI = "27450541-8e31-4150-9947-dc59f998fc01";
VsoTeamProject project = new VsoTeamProject(
newFolderName,
comment,
new Capabilities(new VersionControl("Tfvc"), new ProcessTemplate(projectTemplateId)));
CreateTeamProject(project, "POST", false); // this calls PostResponse method
这是主要方法:
private void PostResponse(VsoTeamProject project, string method, bool useProjectName)
{
string projectState = "wellFormed";
if(method.Equals("DELETE"))
{
projectState = "deleting";
}
var requestUriString = ConstructUrl(
useProjectName ? project.TeamProjectId : string.Empty,
string.Empty,
new Dictionary<string, object>());
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUriString);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = method;
string autorization = TFSImplementor.LoginName + ":" + TFSImplementor.Password;
byte[] binaryAuthorization = Encoding.UTF8.GetBytes(autorization);
autorization = Convert.ToBase64String(binaryAuthorization);
autorization = "Basic " + autorization;
httpWebRequest.Headers.Add("AUTHORIZATION", autorization);
if(method.Equals("POST"))
{
using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = JsonConvert.SerializeObject(project);
streamWriter.Write(json);
}
}
try
{
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
if(httpResponse.StatusCode == HttpStatusCode.Accepted)
{
Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null);
using(var responseStream = responseTask.Result.GetResponseStream())
{
var reader = new StreamReader(responseStream);
var t = reader.ReadToEnd();
ProjectStatus json = JsonConvert.DeserializeObject<ProjectStatus>(t);
if(json.status.Equals("queued"))
{
while(true)
{
if(CheckTeamProjectState(project.ProjectName, true, projectState))
{
break;
}
}
}
}
}
}
catch(WebException e)
{
using(WebResponse response = e.Response)
{
using(Stream data = response.GetResponseStream())
{
using(var reader = new StreamReader(data))
{
string text = reader.ReadToEnd();
Logger.Error(text);
Logger.Exception(e);
if(method.Equals("DELETE"))
{
throw new Exception("Failed to delete project, check log for more details");
}
throw new Exception("Failed to create project, check log for more details");
}
}
}
}
}
以下是您可以使用的类:
Here are the classes that you can use:
private class VsoTeamProject
{
#region Fields
private readonly string m_name;
private readonly string m_comment;
private readonly string m_teamProjectId;
private readonly Capabilities m_capabilities;
#endregion
#region Constructors
public VsoTeamProject(string teamProjectId, string name)
{
m_teamProjectId = teamProjectId;
m_name = name;
}
public VsoTeamProject(string projectName, string description, Capabilities capabilities)
{
m_name = projectName;
m_comment = description;
m_capabilities = capabilities;
}
#endregion
#region Properties
[JsonProperty("name")]
protected internal string ProjectName
{
get
{
return m_name;
}
}
[JsonProperty("description")]
protected internal string Description
{
get
{
return m_comment;
}
}
protected internal string TeamProjectId
{
get
{
return m_teamProjectId;
}
}
[JsonProperty("capabilities")]
protected internal Capabilities Capabilities
{
get
{
return m_capabilities;
}
}
#endregion
}
private class ProjectStatus
{
public string id { get; set; }
public string status { get; set; }
public string url { get; set; }
public string name { get; set; }
public string state { get; set; }
public string message { get; set; }
}
private class Capabilities
{
public Capabilities(VersionControl versionControl, ProcessTemplate template)
{
VersionControl = versionControl;
ProcessTemplate = template;
}
[JsonProperty("processTemplate")]
public ProcessTemplate ProcessTemplate { get; private set; }
[JsonProperty("versioncontrol")]
public VersionControl VersionControl { get; private set; }
}
private class VersionControl
{
public VersionControl(object type)
{
SourceControlType = type;
}
[JsonProperty("sourceControlType")]
public object SourceControlType { get; private set; }
}
private class ProcessTemplate
{
public ProcessTemplate(string templateTypeId)
{
TemplateTypeId = templateTypeId;
}
[JsonProperty("templateTypeId")]
public string TemplateTypeId { get; private set; }
}
我还有这个PostResponse方法,也可以从VSO中删除项目.它像一种魅力.
I've this PostResponse method also for deleting the projects from VSO. It works like a charm.