且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用REST API创建新的团队项目

更新时间: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.