Успешный вызов возвращает неверный запрос. Успех в RestSharp. Ошибка с HttpClient / HttpWebRequest - PullRequest
0 голосов
/ 19 июня 2020

Хорошо! Итак, у меня есть этот вызов Restful, который я пытаюсь сделать устройству Polycom.

Чтобы вроде как изолировать этот код, я использовал RestSharp, и он отлично работает. Также удаление объекта учетных данных или его изменение приводит к тому, что он не авторизован, поэтому я считаю, что с авторизацией все в порядке. Я думаю, что это тело / параметры неверны.

        //THIS SECTION WORKS 
        //RestRequest restRequest = new RestRequest();
        //restRequest.AddJsonBody(body);
        //RestClient restClient = new RestClient(targetUrl);
        //restClient.RemoteCertificateValidationCallback = (sPoint, cert, wRequest, certProb) => true;
        //restClient.Authenticator = new HttpBasicAuthenticator(username, deskPhone.MACPassword);
        //IRestResponse restsharpResponse = await restClient.ExecutePostAsync(restRequest).ConfigureAwait(false);
        //END SECTION 

В чем моя проблема ... Я понятия не имею, почему я получаю сообщение об ошибке 400 Bad Request. Когда я смотрю на то, что у меня есть в разговоре, кажется, что все выравнивается правильно. Токен Auth такой же, как RestSharp, а тело - это тот же объект.

Я действительно не понимаю, что я могу сделать, и, к сожалению, я не могу использовать restsharp, мне нужно использовать то, что доступно в Net Core.

У меня есть несколько различных реализаций в коде, как вы можете видеть ниже. Я попытался использовать HttpClient, и я попытался использовать HttpWebRequest.

Мой вопрос ... Какая у меня вероятная ошибка, которая мешает этому запросу быть правильным.

Эта ссылка на API документация, с которой я, кажется, тоже правильно согласен. https://support.polycom.com/content/dam/polycom-support/products/voice/polycom-uc/other-documents/en/2018/ucsoftware-restapi.pdf

    [HttpPost]
    [Route("[action]")]
    public async Task PhoneNumberStuff(long userId)
    {
        DeskPhone deskPhone = DbContext.DeskPhones
            .Include(x=>x.DeskPhoneUser)                
            .FirstOrDefault(x => x.DeskPhoneUserId == 11546);
        string targetUrl = $"https://{deskPhone.IPv4Address}/api/v1/callctrl/dial";
        string certLcation = @"C:\Users\AlexRoundy\Desktop\Polycom.cer";

        string username = "Polycom";
        SecureString password = new NetworkCredential("", deskPhone.MACPassword).SecurePassword;

        String encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + deskPhone.MACPassword));

        //$cred = New - Object System.Management.Automation.PSCredential($username,$password)
        NetworkCredential credential = new NetworkCredential(username, password);

        string body = @"{""data"":{""Dest"": ""7168675309"", ""Line"": ""1"",""Type"": ""TEL"" } }";


        //THIS SECTION WORKS 
        //RestRequest restRequest = new RestRequest();
        //restRequest.AddJsonBody(body);
        //RestClient restClient = new RestClient(targetUrl);
        //restClient.RemoteCertificateValidationCallback = (sPoint, cert, wRequest, certProb) => true;
        //restClient.Authenticator = new HttpBasicAuthenticator(username, deskPhone.MACPassword);
        //IRestResponse restsharpResponse = await restClient.ExecutePostAsync(restRequest).ConfigureAwait(false);
        //END SECTION 

        HttpClientHandler handler = new HttpClientHandler();
        //handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls11;
        handler.ServerCertificateCustomValidationCallback = (sPoint, cert, wRequest, certProb) => true;
        //handler.CheckCertificateRevocationList = false;
        handler.Credentials = credential;
        //handler.ClientCertificateOptions = ClientCertificateOption.Manual;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUrl);

        request.ServerCertificateValidationCallback = (sPoint, cert, wRequest, certProb) => true;
        request.ContentType = "application/json; charset=utf-8";
        request.Method = "POST";
        request.Headers.Add("Authorization", "Basic " + encoded);
        request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.None;
        request.Accept = "application/json";

        using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream()))
        {
            streamWriter.Write(body);
            streamWriter.Flush();
        }

        HttpWebResponse httpResponse = (HttpWebResponse)request.GetResponse();
        string responseText;
        using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            responseText = streamReader.ReadToEnd();
        }

        HttpClient httpClient = new HttpClient(handler);
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));




        StringContent temp = new StringContent(body, Encoding.UTF8, "application/json");



        HttpRequestMessage httpMessage = new HttpRequestMessage(HttpMethod.Post, targetUrl);
        httpMessage.Content = temp;


        HttpResponseMessage testA = await httpClient.SendAsync(httpMessage).ConfigureAwait(false);

        HttpResponseMessage stuff = await httpClient.PostAsync(targetUrl, temp).ConfigureAwait(false);

        handler.Dispose();
        httpMessage.Dispose();

        httpClient.Dispose();
    }

1 Ответ

0 голосов
/ 19 июня 2020

Итак, ниже приведены два сравнения от скрипачей.

Здесь возникает проблема с дочерним элементом.

request.ContentType = "application/json; charset=utf-8";

Исправление ??

request.ContentType = "application/json";

Следующее ниже приведены результаты скрипта, которые привели к открытию.

POST https://192.168.50.76/api/v1/callctrl/dial HTTP / 1.1 Авторизация: Basi c UG9seWNvbTp3TUh0bDNKdA == Accept: application / json, text / json, text / x- json, text / javascript, application / xml, text / xml User-Agent: RestSharp / 106.11.4.0 Подключение: Keep-Alive Accept-Encoding: gzip, deflate Content-Type : application / json Content-Length: 60 Host: 192.168.50.76

{"data": {"Dest": "7164171568", "Line": "1", "Type": "TEL"} }

POST https://192.168.50.76/api/v1/callctrl/dial HTTP / 1.1 Авторизация: Basi c UG9seWNvbTp3TUh0bDNKdA == Accept: application / json, text / json, text / x- json , text / javascript, application / xml, text / xml Пользовательский агент: FauxPaux Подключение: Keep-Alive Accept-Encoding: deflate Content-Type: application / json; Content-Length: 60 Хост: 192.168.50.76

{"data": {"Dest": "7164171568", "Line": "1", "Type": "TEL"}}

...