Я работаю в качестве стажера в приложении Controll (c # WPF) для REST API рабочей станции VMware 15, чтобы:
- «GET» Получить список доступных на данный момент виртуальных машин на сервере. (Готово)
- «GET» Получить статус питания любой виртуальной машины через идентификатор. (Готово)
- "PUT" Получить любую виртуальную машину для загрузки. (WIP)
- "PUT" Выключить любую виртуальную машину. (НЗП)
В настоящее время я использую .NET HTTPClient для отправки инструкций в VMServer, и до сих пор мне удавалось получить всю информацию из любой возможной команды GET, однако я не мог понять, как избежать получения ошибки 406 от пытаясь использовать команды PUT для включения или выключения любой виртуальной машины на сервере. Я попытался использовать следующее в качестве принимающего заголовка и медиа / тип контента в различных комбинациях:
- Специфичная для VMWare "application / vnd.vmware.vmw.rest-v1 + json".
- Принимаем все "* / *".
- Совсем нет (по умолчанию).
Код, выполняющий заказы, запускается событием нажатия кнопки:
//Needs a VMID, valid IP and valid Port, Password and User will be handled aswell, but aren't requiered to start the request
if (tb_VMID.Text.Length > 0 && isIPVailid && isPortValid)
{
string Link = "https://" + tb_IP.Text + ":" + tb_Port.Text + "/api/vms/" + tb_VMID.Text + "/power";
//here starts the preperation of the httpclient info
using (HttpClientHandler _handler = new HttpClientHandler())//Handler for credentials
{
_handler.Credentials = new NetworkCredential(tb_Username.Text, tb_Pass.SecurePassword);
using (HttpClient _httpClient = new HttpClient(_handler))//Client with Credentials
{
//Header handling (Note that the passowrd is encrypded in base 64 and needs to be that way)
_httpClient.DefaultRequestHeaders.Add("Authorization", "Basic " + CreateBaseCode());
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.vmware.vmw.rest-v1+json"));
//Request preperation
using (HttpContent _content = new StringContent("on", Encoding.UTF8, "application/vnd.vmware.vmw.rest-v1+json"))
{
//now here starts the PUT request, it's async but I already have 2 working async methods to GET info, would be wierd if that would be the problem, especialy since i tried the same without async.
var data = _httpClient.PutAsync(Link, _content);
tb_Response.Text = data.Result.ToString();
}
}
}
}
Результат следующий:
StatusCode: 406, ReasonPhrase: 'Not Acceptable', Version: 1.1, Content:
System.Net.Http.StreamContent, Headers:
{
Access-Control-Allow-Origin: *
Connection: close
Cache-Control: no-cache
Date: Fri, 12 Apr 2019 12:42:04 GMT
Content-Length: 58
Content-Type: application/vnd.vmware.vmw.rest-v1+json
}
У меня вопрос, можно ли обойти эту ошибку или это проблема с REST или .NET Framework?