Как исправить нулевое значение build.Definition в вызове REST API TFS Queue Build - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь поставить в очередь сборку с моих серверов TFS, используя пакет nuget TFS Rest API для c #.Однако после отправки запроса на сервер с JSON:

"definition":{ "id":63 }

я получаю ответ 400 с ошибкой:

message=Value cannot be null. Parameter name: build.Definition

Я думаю, что отправляю JSON правильно,учитывая то, что до того, как я получил ошибки, я не могу сказать, что его нельзя десериализовать, или, во-первых, не было JSON.

Может ли кто-нибудь помочь мне выяснить, что является причиной этой ошибки и как ее исправить?

Для справки и демонстрации того, что я уже использовал в качестве справки:

Документация Microsoft

Построение очереди с использованием Powershell

Снова Очередь сборки в powershell

и ряд других статей (google "сборка очередей tfs rest api c #")

//post request for queuing the build
var client = new RestClient(websiteName);
var request = new RestRequest("_apis/build/builds?ignoreWarnings=true&sourceBuildId=63&api-version=4.0", Method.POST, DataFormat.Json);

Dictionary<string, string> values = new Dictionary<string, string>();
values.Add("{\"definition\"", "{\"id\":63}}");

request.AddHeader("Authorization", "Basic " + Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", personalAccessToken))));

request.AddJsonBody(values);
IRestResponse response = client.Execute(request);

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Если вы используете пакеты nuget Rest API, вы можете использовать встроенные методы для постановки в очередь новой сборки, это будет гораздо удобнее, чем использование HttpClient или другого класса:

var url = new Uri("http://tfsServer:8080/tfs/MyCollection/");
var connection = new VssConnection(url, new VssCredentials());
var buildServer = connection.GetClient<BuildHttpClient>();           
// Get the list of build definitions.
var  definition = buildServer.GetDefinitionAsync("teamprojectname", 33).Result;

//It requires project's GUID, so we're compelled to get GUID by API.
var res = buildServer.QueueBuildAsync(new Build
{
      Definition = new DefinitionReference
{
Id = definition.Id
},
      Project = definition.Project
});
Console.WriteLine($"Queued build with id: {res.Id}");

Если вы по-прежнемухотите использовать URL для запуска, вот также пример:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://tfsServer:8080/tfs/DefaultCollection/TeamProject/_apis/build/builds?api-version=4.0");
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Method = "Post";
request.ContentType = "application/json";
Stream stream = request.GetRequestStream();
string json = "{\"definition\":{\"id\":63}}";
byte[] buffer = Encoding.UTF8.GetBytes(json);
stream.Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.Write(response.StatusCode);
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
     var result = streamReader.ReadToEnd();
}
Console.Read();
0 голосов
/ 24 декабря 2018

"definition":{ "id":63 } не является допустимым JSON.

{ "definition":{ "id":63 } } is.

Не создавайте JSON как строку, используйте ConvertTo-Json в ассоциативном массиве, чтобы соответствующим образом повернуть-образный объект в JSON, например

$body = @{
    definition = @{ 
        id = $definitionId
    }
} | ConvertTo-Json -Depth 100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...