2017-05-29 1 views
3

Qu'est-ce que je fais de mal ici?Http Client Une connexion existante a été fermée de force par l'hôte distant

 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; 

Quand je lance le code ci-dessus je reçois cette erreur: Une connexion existante a été fermée de force par l'hôte distant Je suis allé sur le code quelques fois et tout semble bien, certains articles suggèrent l'erreur Je reçois est un problème de serveur, mais lorsque je tente avec R-client, il fonctionne très bien

Http request

Répondre

2

Cela peut être dû au fait que le client et le serveur ne peuvent pas se mettre d'accord sur une version du protocole TLS à utiliser.

Je pense que c'est le cas par défaut .Net 4.5.2 et versions antérieures à v1, avec la version 1.2 désactivée si elle est incluse dans le framework. (. Dans .Net 4.6 *, v1.2 est la valeur par défaut.)

Pour activer v1.2 en 4.5.2 vous pouvez utiliser:

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

(je crois que ce qui lui permet de l'ensemble de l'application domaine?)

Résolu le problème (contre un site Web différent) pour moi, quoi qu'il en soit.

+0

Merci c'est ce que j'ai fait à la fin – Jack

1

s'il vous plaît modifier le code ci-dessous selon

1) le problème est avec https. vous devez ajouter un certificat approprié pour cela.

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; 

une autre fonction pour convertir JSON HttpContent

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

ou vous pouvez contourner l'erreur cerificate Lors du développement ou de traiter avec certs auto-signés, vous pouvez ignorer les erreurs de cert non fiables avec les éléments suivants: ServicePointManager.ServerCertificateValidationCallback + = (expéditeur, cert, chaîne, sslPolicyErrors) => true;

+0

ce travail doenst car client.PostAsync ne peut pas accepter la chaîne – Jack

+0

désolé, je rate cette chose. Maintenant, j'ai mis à jour le code, il devrait fonctionner. –

+0

toujours obtenir la même erreur Une connexion existante a été fermée de force par l'exception interne hôte distant: {"Une erreur s'est produite lors de l'envoi de la demande."} – Jack