[英]C# HttpClient PostAsync 403 forbidden with SSL
因为当我进行 POST 时我们切换到带有 SSL 的服务器,所以我总是收到 403 禁止错误,但是如果我使用 WebClient 它工作正常,无论如何我仍然想让它与 HttpClient 一起工作因为我必须更改很多代码还有一个使用 MultipartFormDataContent 发布文件的调用,我无法使用 WebClient 执行此操作,在 Webclient 中,我可以选择发布数据或上传文件,但我需要在一次调用中发布数据和文件。
这是 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);
我尝试对 header、UseDefaultCredentials = true 等进行更改,但没有任何效果。
编辑:即时通讯使用 .net 核心 3.0 Edit2:带 HttpClient 的 GetAsync 工作正常,问题仅在于 PostAsync。
好的,所以我尝试与 fiddler 进行比较并更改一些东西,以便 httpclient 调用更像 webclient 但我仍然得到 403 左边是 WebClient,右边是 HttpClient比较图像
[解决方案]添加以下 header 部分
Headers.Add("用户代理:其他");
您需要将HttpClienthandler
object 传递给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
确保您没有代理阻止呼叫。 要么不要使用代理,要么确保您配置了正确的地址和端口。 使用 mortb 示例中的处理程序:
using (var handler=new HttpHandler())
{
handler.UseProxy=false;
var client=new HttpClient(handler);
var result=await client.PostAsync(url);
//… retrieve the content
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.