, так как мы переключаемся на сервер с 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 Сравните изображение