Ошибка 406, несмотря на предоставление правильного заголовка accept / contenttype для VMware REST API с .NET HTTPClient? - PullRequest
0 голосов
/ 15 апреля 2019

Я работаю в качестве стажера в приложении Controll (c # WPF) для REST API рабочей станции VMware 15, чтобы:

  1. «GET» Получить список доступных на данный момент виртуальных машин на сервере. (Готово)
  2. «GET» Получить статус питания любой виртуальной машины через идентификатор. (Готово)
  3. "PUT" Получить любую виртуальную машину для загрузки. (WIP)
  4. "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?

...