web-dev-qa-db-fra.com

"La connexion sous-jacente a été fermée: une erreur inattendue s’est produite lors d’un envoi.". Le facteur va bien avec les mêmes en-têtes

Scénario

  • Win10 x64 
  • VS2013

J'essaie de faire un WebRequest, mais j'obtiens l'erreur suivante:

La connexion sous-jacente a été fermée: une erreur inattendue s'est produite lors d'un envoi.

En creusant dans l'exception intérieure, j'ai eu:

"Impossible de lire les données de la connexion de transport: une connexion existante a été fermée de force par l'hôte distant."

Le code qui fait la demande est le suivant:

private static Hashtable exec (String method, String uri, Object data, String contentType) {
    Hashtable response;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create (API_BASE_URL + uri);

    request.UserAgent = "MercadoPago .NET SDK v"+MP.version; //version resolves to 0.3.4
    request.Accept = MIME_JSON; // application/json
    request.Method = method; //GET
    request.ContentType = contentType; //application/json
    setData (request, data, contentType); //setData in this case does nothing.

    String responseBody = null;
    try {
      HttpWebResponse apiResult = (HttpWebResponse)request.GetResponse (); //Error throws here
      responseBody = new StreamReader (apiResult.GetResponseStream ()).ReadToEnd ();

      response = new Hashtable();
      response["status"] = (int) apiResult.StatusCode;
      response["response"] = JSON.JsonDecode(responseBody);
    } catch (WebException e) {
      Console.WriteLine (e.Message);
    }
}

Ce que j'ai déjà fait:

  • Fait la demande via Console Application et MVC Application Controller. Les deux lève la même exception
  • Appelé l'API via Postman avec exactement les mêmes en-têtes, ce qui m'apporte le contenu correctement.

Ces demandes fonctionnaient bien via c # il y a environ 4 jours et j'ai soudainement commencé à avoir des problèmes, mais compte tenu du fait que cela répond bien à Postman, je ne peux pas savoir où est le problème.

Voici la réponse de Postman

 enter image description here

EDIT: Les deux requêtes avec Fiddler étaient-elles à l'écoute? Le résultat pour Postman montre une demande directe à l'API avec HTTPS. Lorsque vous essayez avec ConsoleApplication, une requête HTTP s'affiche, ce qui crée un tunnel vers le point de terminaison de l'API, le port 443.

 enter image description here

Le TextView de Fiddler pour la demande de tunnel dit ceci:

 enter image description here

J'ai remarqué le champ "heure" qui fait référence à une date très ancienne, mais je ne sais pas ce que cela signifie.

8

Deviner. J'avais besoin d'inclure l'utilisation de TLS1.2.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
2

Vous pouvez essayer le code ci-dessous:

string url = ""; // url of the endpoint

WebClient client = new WebClient();
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
client.Encoding = Encoding.UTF8;
client.Headers.Add("content-type", "application/json"); // same as other parameters in the header

var data = client.DownloadString(url);
6
Uttam Gupta

C'est un peu une mauvaise pratique d'activer Tls12 comme ceci-

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

À l'avenir, si vous devez utiliser une version supérieure de TLS, vous devrez mettre à jour votre code.

Si vous utilisez une ancienne version de .NET, vous pouvez simplement changer de version supérieure dans laquelle Tls12 est activé par défaut.

Par exemple, cette simple modification de votre web.config activera automatiquement Tls12.

<httpRuntime targetFramework="4.6.1"/>
5
kamalpreet

Cela peut également résulter d'un problème Double Hop , dans lequel vous devez transmettre l'utilisateur crédité (dans le pool) au serveur de passage ou d'un environnement à l'autre, sinon l'utilisateur est défini sur "ANONYMOUS/USER" et vous obtiendrez un "Une connexion existante a été forcée de force par l'hôte distant". Erreur

4
Wesam

j'ai trouvé la même erreur, il suffit de mentionner request.UserAgent = "tout ce que vous voulez";

0
Surendra Tarai