使用SSL禁止C#HttpClient PostAsync 403

使用SSL禁止C#HttpClient PostAsync 403,c#,visual-studio,C#,Visual Studio,因为当我发布帖子时,我们切换到一个带有SSL的服务器,我总是收到一个403禁止的错误,但是如果我使用WebClient,它工作得很好,无论如何,我仍然想让它与HttpClient一起工作,因为我必须更改很多代码,而且有一个调用使用MultipartFormDataContent发布文件,而我不能使用WebClient这样做,在Webclient中,我可以选择发布数据或上载文件,但我需要在一次调用中发布数据和文件 下面是HttpClient和WebClient调用的示例 HttpClient(40

因为当我发布帖子时,我们切换到一个带有SSL的服务器,我总是收到一个403禁止的错误,但是如果我使用WebClient,它工作得很好,无论如何,我仍然想让它与HttpClient一起工作,因为我必须更改很多代码,而且有一个调用使用MultipartFormDataContent发布文件,而我不能使用WebClient这样做,在Webclient中,我可以选择发布数据或上载文件,但我需要在一次调用中发布数据和文件

下面是HttpClient和WebClient调用的示例

HttpClient(403禁止的错误)

private async void Login\u单击(对象发送方,RoutedEventArgs e)
{
Apic=加密引擎.解密API(Apic);
if(API())
{
使用(var content=new MultipartFormDataContent())
{
if(EmailText.Text.Contains(“@”)和&EmailText.Text.Contains(“.”)
{
content.Add(新的StringContent(EmailText.Text),“email\”;
}
其他的
{
添加(新的StringContent(EmailText.Text),“\”用户名\“);
}
添加(新的StringContent(PasswordText.Password),“\”Password\”;
使用(var httpClient=new httpClient())
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.ParseAdd(“应用程序/json”);
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/51.0.2704.103 Safari/537.36”);
httpClient.DefaultRequestHeaders.Add(“appName”、“CloudMetaPrinter”);
httpClient.DefaultRequestHeaders.Add(“纬度”,Apic.latitude);
httpClient.DefaultRequestHeaders.Add(“经度”,Apic.longitude);
httpClient.DefaultRequestHeaders.Add(“主机名”,Apic.IP);
httpClient.DefaultRequestHeaders.Add(“主机类型”、“PC”);
var httpResponse=httpClient.PostAsync(url+“/”+api+“/auth/login”,内容);
responseContent=wait-httpResponse.Result.Content.ReadAsStringAsync();
结果=JsonConvert.DeserializeObject(responseContent);
网络客户端(工作正常)

private void登录\u单击(对象发送者,路由目标)
{
Apic=加密引擎.解密API(Apic);
if(API())
{
字符串数据;
if(EmailText.Text.Contains(“@”))
{
data=JsonConvert.SerializeObject(新
{
email=EmailText.Text,
password=PasswordText.password
});
}
其他的
{
data=JsonConvert.SerializeObject(新
{
用户名=EmailText.Text,
password=PasswordText.password
});
}
使用(var-httpClient=new-WebClient{UseDefaultCredentials=true})
{
httpClient.Headers.Add(“appName”、“CloudMetaPrinter”);
httpClient.Headers.Add(“纬度”,顶点纬度);
httpClient.Headers.Add(“经度”,Apic.longitude);
httpClient.Headers.Add(“主机名”,Apic.IP);
httpClient.Headers.Add(“主机类型”、“PC”);
添加(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);
结果=JsonConvert.DeserializeObject(str);
我试图在标题中进行更改,UseDefaultCredentials=true等,但没有任何效果

编辑:im使用.net core 3.0 Edit2:GetAsync与HttpClient配合使用效果良好,问题仅在于PostAsync

好吧,我试着和fiddler进行比较,改变一些东西,使httpclient调用更像webclient,但我还是得到了403 左边是WebClient,右边是HttpClient

您需要将
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
可能效率低下,最好重新使用它。)


无论代码是什么,您都可以轻松使用fiddler查看这两种方法在发布到服务器时的不同之处,以帮助您解决未来的问题您在每种情况下都使用不同的凭据。对于WebClient,您使用的是Windows身份验证。对于HttpClient,根本没有身份验证。您甚至没有传递基本的身份验证ation头。将HttpClient代码更改为使用Windows身份验证。这两个代码段也非常不同-第一个发布表单,第二个发送JSON字符串。为什么您希望它们的行为相同?@PanagiotisKanavos在使用SSL服务器之前,HttpClient工作,所以我猜是因为Windows身份验证,但我有麻烦查找有关如何将HttpClient更改为使用Windows的信息Authentication@mortb不,如果他们最终使用WebClient,我需要使用HttpClient。我已经尝试过了,但我仍然禁止使用403,至少使用post,使用get,我没有设置任何内容,而且它可以工作。很难比较你问题中的两个示例。你发布
 您的
HttpClient
示例中的MultipartFormDataContent
,以及
WebClient
示例中的json字符串,因此它们做了不同的事情。您是否尝试过使用
HttpClient
发布json?我知道这是不同的,但如果我
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);
   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();
   }