C# HttpClient PostAsyn c 403 запрещено с SSL - PullRequest
0 голосов
/ 16 июня 2020

, так как мы переключаемся на сервер с SSL, когда я делаю POST, я всегда получаю 403 запрещенную ошибку, но если я использую WebClient, он работает нормально, в любом случае я все равно хочу, чтобы он работал с HttpClient, потому что мне пришлось бы изменить много кода, а также есть вызов, который отправляет файл с помощью MultipartFormDataContent, и я не могу сделать это с помощью WebClient, в Webclient у меня есть возможность отправить данные POST или загрузить файл, но мне нужно отправить данные POST и файл за один вызов .

вот пример HttpClient и вызовов WebClient

HttpClient (403 запрещенная ошибка)

 private async void Login_Click(object sender, RoutedEventArgs e)
    {
        Apic = CryptoEngine.DecryptAPI(Apic);
        if (API())
        {
            using (var content = new MultipartFormDataContent())
            {
                if (EmailText.Text.Contains("@") && EmailText.Text.Contains("."))
                {
                    content.Add(new StringContent(EmailText.Text), "\"email\"");
                }
                else
                {
                    content.Add(new StringContent(EmailText.Text), "\"username\"");
                }

                content.Add(new StringContent(PasswordText.Password), "\"password\"");
                using (var httpClient = new HttpClient())
                {
                    httpClient.DefaultRequestHeaders.Clear();
                    httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/json");
                    httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36");
                    httpClient.DefaultRequestHeaders.Add("appName", "CloudMetaPrinter");
                    httpClient.DefaultRequestHeaders.Add("latitude", Apic.Latitude);
                    httpClient.DefaultRequestHeaders.Add("longitude", Apic.Longitude);
                    httpClient.DefaultRequestHeaders.Add("hostname", Apic.IP);
                    httpClient.DefaultRequestHeaders.Add("hostType", "PC");
                    var httpResponse = httpClient.PostAsync(url + "/" + api + "/auth/login", content);
                    responseContent = await httpResponse.Result.Content.ReadAsStringAsync();
                    Result result = JsonConvert.DeserializeObject<Result>(responseContent);

WebClient (отлично работает)

private void Login_Click(object sender, RoutedEventArgs e)
    {
        Apic = CryptoEngine.DecryptAPI(Apic);
        if (API())
        {
            string data;
            if (EmailText.Text.Contains("@"))
            {
                data = JsonConvert.SerializeObject(new
                {
                    email = EmailText.Text,
                    password = PasswordText.Password
                });
            }
            else
            {
                data = JsonConvert.SerializeObject(new
                {
                    username = EmailText.Text,
                    password = PasswordText.Password
                });
            }
            using (var httpClient = new WebClient { UseDefaultCredentials = true })
            {
                httpClient.Headers.Add("appName", "CloudMetaPrinter");
                httpClient.Headers.Add("latitude", Apic.Latitude);
                httpClient.Headers.Add("longitude", Apic.Longitude);
                httpClient.Headers.Add("hostname", Apic.IP);
                httpClient.Headers.Add("hostType", "PC");
                httpClient.Headers.Add(HttpRequestHeader.ContentType, "application/json; charset=utf-8");
                var httpResponse = httpClient.UploadData(url + "/" + api + "/auth/login", "POST", Encoding.UTF8.GetBytes(data));
                var str = System.Text.Encoding.Default.GetString(httpResponse);
                Result result = JsonConvert.DeserializeObject<Result>(str);

Я пытался внести изменения в заголовок, UseDefaultCredentials = true, et c и ничего не работает.

Edit: im using. net core 3.0 Edit2: GetAsyn c с HttpClient работает хорошо, проблема только с PostAsyn c.

Хорошо, поэтому я попытался сравнить со скрипачом и кое-что изменить, поэтому вызов httpclient больше похож на веб-клиента, но все еще Я получаю 403 Слева - WebClient, а справа - HttpClient Сравните изображение

1 Ответ

1 голос
/ 16 июня 2020

Вам необходимо передать объект HttpClienthandler в конструктор HttpClient. Свойство UseDefaultCredentials было перемещено в HttpClienthandler

Пример:

   using(var handler = new HttpClientHandler())
   {
      handler.UseDefaultCredentials = true;

      using(var client = new HttpClient(handler))
      {

         var response = await client.GetAsync("http://www.contoso.com/");
         response.EnsureSuccessStatusCode();

         var responseBody = await response.Content.ReadAsStringAsync();
   }

(Обратите внимание, что часто использовать Dispose() HttpClient может быть неэффективно, лучше для повторного использования.)

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler?view=netcore-3.1

...