2015-07-31 4 views
1

Ive ударил головой об этом всю неделю. Создание нового проекта команды с использованием REST api. Везде, где я смотрю, ответ один и тот же, и он всегда включает в себя использование командной строки и xml.Создание нового проекта команды с использованием REST api

Но почему?

На наглядных студии страниц в Интернете это можно найти:

https://www.visualstudio.com/en-us/integrate/api/tfs/projects

(В частности, глядя на части с надписью «Создать командный проект»)

Так почему же это, если оно наклоненная существует использоваться? Или я что-то не хватает?

Если кто-нибудь знает какие-либо примеры использования этого, я бы очень признателен.

Ive были с помощью Microsoft.TeamFoundation.WorkItemTracking.Client пространств имен и т.д ... и счастливо создания новых рабочих элементов в проекты

и Ive даже удалось использовать API рушить списки проектов тоже. с использованием кода из этого примера (прокрутите вниз страницы)

https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

, но я не могу за жизнь мне опубликовать новый проект команды.

На данный момент я открыт для любых предложений, я создал учетную запись здесь только спросить (я люблю этот сайт) :(

В соответствии с просьбой, код:

static async Task<string> PostProjectAsync(HttpClient _client, string _apiUrl, string _apiVersion) 
    { 
     var responseBody = string.Empty; 

     HttpContent hc = new StringContent(@" 
      { 
       ""name"": ""Testprojectfromconsole"", 
       ""description"": ""Posted from console application using the tfs API"" 
      } 
      "); 
     //TODO: make a class that matches the json layout that the api is expecting 
     //then see if you have any better luck with that instead of this horrid horrid mess 

     ProjectPost newproj = new ProjectPost(); 
     newproj.Name = @"Test Project -From console"; 
     newproj.Description = @"Hopefully this has been posted from the console app, delete it later on if need be."; 
     newproj.Capabilities.VersionControl.SourceControlType = @"TFS"; //probably wrong 
     newproj.Capabilities.ProcessTemplate.TemplateTypeId = @"default"; //also probably wrong 

     string json = JsonConvert.SerializeObject(newproj); 

     try 
     { 
      using (HttpResponseMessage response = _client.PostAsync(_apiUrl + _apiVersion, hc).Result) 
      { 
       response.EnsureSuccessStatusCode(); 
       responseBody = await response.Content.ReadAsStringAsync(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 

     return responseBody; 
    } 

В настоящее время Я передаю HttpContent под названием «hc» в postasync, но если я переключу его на объект json, postasync перестанет работать (потому что он хочет, чтобы httpcontent не был json)

до того, как этот метод вызван, клиент настроен вверх так:

client.DefaultRequestHeaders.Accept.Add(
       new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); 



      //Set alternate credentials 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", 
       Convert.ToBase64String(
        System.Text.ASCIIEncoding.ASCII.GetBytes(
         string.Format("{0}:{1}", ALTUSERNAME, ALTPASSWORD)))); 

      Console.WriteLine("<--------------Getting projects from tfs!-------------->"); 
      Console.WriteLine("<----------------Hold on to your butts!---------------->"); 

      responseBody = await GetAsync(client, BASEURL + "projects", APIVERS); 

      Console.WriteLine(responseBody.ToString()); 

      Console.WriteLine("<----------------Making a new project!----------------->"); 
      Console.WriteLine("<----------------Hold on to your butts!---------------->"); 

      responseBody = await PostProjectAsync(client, BASEURL + "projects", APIVERS); 

      Console.WriteLine(responseBody.ToString()); 

о, и URL таково:

static string PN1 = @"Test Project -From Web"; 
    static string PN2 = @"Another Test Project -From Web"; 
    static string COL = @"DefaultCollection"; 

    static string BASEURL = "https://{0}.visualstudio.com/DefaultCollection/_apis/"; 

    // Get the alternate credentials that you'll use to access the Visual Studio Online account. 
    static string ALTUSERNAME = "myusername"; 
    static string ALTPASSWORD = "mypassword!"; 



    //Your visual studio account name 
    static string ACCOUNT = "ourserver"; 

    //Api version query parameter 
    static string APIVERS = "?api-version=1.0"; 
+0

Можете ли вы предоставить подробную информацию о том, что вы пробовали и какие были неудачи? –

+0

, когда я передаю httpContent мой вывод на консоль, скажите мне код ошибки 405, когда метод расследования не разрешен:/ –

+0

Можете ли вы попробовать изменить sourceControlType на «TfVc»? –

ответ

0

Вот код, который я использовал. Это сделано для .net 3.5, но я нашел решение с .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"); 
         } 
        } 
       } 
      } 
     } 

Вот классы, которые вы можете использовать:

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. Отлично работает.

Смежные вопросы