Scénario
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:
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
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.
Le TextView de Fiddler pour la demande de tunnel dit ceci:
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.
Deviner. J'avais besoin d'inclure l'utilisation de TLS1.2.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
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);
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"/>
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
j'ai trouvé la même erreur, il suffit de mentionner request.UserAgent = "tout ce que vous voulez";