2017-05-29 205 views
3

我在这里做错了什么?Http客户端现有的连接被远程主机强行关闭

 var formContent = new FormUrlEncodedContent(new[] 
      { 
      new KeyValuePair<string, string>("mobile_numbers", "5555555555"), 
      new KeyValuePair<string, string>("message", "Whoo hahahahah") 
      });   

     HttpClient client = new HttpClient(); 
     client.BaseAddress = new Uri("https://api.iwin.co.za"); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "134134134"); 
     HttpResponseMessage response = client.PostAsync("iwin/api/v1/messages", formContent).Result; 

当我运行上面的代码我得到这个错误:一个现有的连接被强行远程主机 我去了代码几次,一切都看起来不错关闭,一些文章建议的错误我得到的是一个服务器的问题,但是当我用R-客户端尝试它工作正常

Http request

回答

2

如果客户端和服务器无法就要使用的TLS协议版本达成一致,则可能会导致此问题。

我认为这种情况是.Net 4.5.2和更早版本默认为v1,v1.2如果包含在框架中则取消激活。 (在.NET中4.6 * 1.2版是默认的。)

要启用V1.2 4.5.2你可以使用:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 

(我相信这使得它为整个应用程序域?)

无论如何,解决了这个问题(针对不同的网站)。

+0

谢谢你,这是我最后做的 – Jack

1

请按照以下

更改代码

1)问题在于https。你需要为它添加适当的证书。

Dictionary<string, string> formContent= new Dictionary<string, string>(); 
mapObject.Add("mobile_numbers","5555555555"); 
mapObject.Add("message","Whoo hahahahah") 

var jsonString = JsonConvert.SerializeObject(formContent); 

WebRequestHandler handler = new WebRequestHandler(); 
X509Certificate2 certificate = GetMyX509Certificate(); 
handler.ClientCertificates.Add(certificate); 

HttpClient client = new HttpClient(handler); 
client.BaseAddress = new Uri("https://api.iwin.co.za"); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
client.DefaultRequestHeaders.Add("Authorization", "Bearer 134134134"); 

HttpResponseMessage response = client.PostAsync("/iwin/api/v1/messages", getHttpContent(jsonString)).Result; 

另一个函数以JSON转换为HttpContent

private static HttpContent getHttpContent(string jsonString) 
     { 
      var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); 
      return content; 
     } 

,或者你可以绕过cerificate错误 在开发或处理的自签名的证书,你可以忽略与以下不可信证书错误:ServicePointManager.ServerCertificateValidationCallback + =(sender,cert,chain,sslPolicyErrors)=> true;

+0

这个dostst工作,因为client.PostAsync不能接受字符串 – Jack

+0

对不起,我错过了那件事。现在我更新了代码它应该工作。 –

+0

仍然收到相同的错误现有连接被远程主机内部异常强制关闭: {“发送请求时发生错误。”} – Jack

相关问题