自从我们切换到带SSL的服务器后,当我进行POST请求时,我总是收到403禁止错误。但是如果我使用WebClient,它就可以正常工作。无论如何,我仍然希望能够使用HttpClient使其正常工作,因为我不得不改变很多代码,并且还有一个调用使用MultipartFormDataContent发布文件,我不能使用WebClient做到这一点。在WebClient中,我可以选择发布数据或上传文件,但我需要在一个调用中同时发布数据和文件。
以下是HttpClient和WebClient调用的示例:
HttpClient(403禁止错误)
我试图在标题中进行更改,使用 UseDefaultCredentials = true 等等,但是没有任何作用。
编辑:我正在使用 .net core 3.0 编辑2:使用 HttpClient 的 GetAsync 正常工作,问题只出现在 PostAsync 中。
好的,所以我尝试与 Fiddler 进行比较,并更改一些内容,使 httpclient 调用更像 webclient,但仍然得到了 403 错误。 左侧是 WebClient,右侧是 HttpClient 比较图片
以下是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 等等,但是没有任何作用。
编辑:我正在使用 .net core 3.0 编辑2:使用 HttpClient 的 GetAsync 正常工作,问题只出现在 PostAsync 中。
好的,所以我尝试与 Fiddler 进行比较,并更改一些内容,使 httpclient 调用更像 webclient,但仍然得到了 403 错误。 左侧是 WebClient,右侧是 HttpClient 比较图片