Я пытаюсь запустить выпуск для конкретной среды, используя CEST и RFS API TFS.
Я получил код для выполнения запроса, но не могу понять, как организовать параметры длязапрос патча.
public void LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{
var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}";
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
var patchDocument = new Object[1];
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var patchValue = new StringContent(JsonConvert.SerializeObject(patchDocument), Encoding.UTF8, "application/json-patch+json");
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, releaseUrl) { Content = patchValue };
var response = client.SendAsync(request).Result;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
}
}
}
Я видел в Интернете, что это должно быть что-то вроде (взято из другого примера):
patchDocument[0] = new { op = "replace", path = "/relations/attributes/comment", value = "Adding traceability to dependencies" };
Но я надеваюне знаю, как совместить это с параметрами, необходимыми для операции PATCH.Любая идея?
Обновление: при воспроизведении запроса TFS в браузере я увидел, что API, используемый для внутренних запросов, был 3.2-preview.4
К тому времени, войдя в Postman, я смог успешносоздать запрос.Я экспортировал содержимое C # и включил его в VS (он использует Restsharp).И это сработало.
var client = new RestClient("http://MYURL/tfs/MyCollection/MyProj/_apis/Release/releases/3329/environments/11719?api-version=3.2-preview.4");
var request = new RestRequest(Method.PATCH);
request.AddHeader("postman-token", "3f94c3a4-da61-9487-8aeb-7238b4355a77");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Basic MyToken");
request.AddParameter("application/json", "{\"status\":2,\"scheduledDeploymentTime\":null,\"comment\":null}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
Тем не менее, я не могу заставить работать оригинальный код, даже несмотря на внесение соответствующих изменений.Вот текущий код
public async Task<string> LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{
//Create the URI with the environment to deploy to:
var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}?api-version=3.2-preview.4";
//Create the patch Document
var patchDocument = new
{
status = 2,
};
var json = JsonConvert.SerializeObject(patchDocument);
var patchContent = new StringContent(json, Encoding.UTF8, "application/json-patch+json");
using (var client = new HttpClient())
{
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, releaseUrl) { Content = patchContent };
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsStringAsync();
return result;
}
return null;
}
}
Я мог бы использовать RestSharp, но я хотел бы знать, почему он работает в одном случае, а не в другом.