"Базовое соединение закрыто: непредвиденная ошибка при передаче.". Почтальон идет нормально с теми же заголовками
сценарий
- Win10 x64
- VS2013
Я пытаюсь сделать WebRequest, но я получаю следующую ошибку:
базовое соединение закрыто: непредвиденная ошибка при передаче.
копаясь во внутреннем исключении, я получил:
"Не удается прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленный хост."
код, который выполняет запрос, следующий:
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);
}
}
что я уже сделал:
- сделал запрос через консольное приложение и контроллер приложений MVC. Оба выбрасывают одно и то же исключение
- вызвал API через Postman с точно такими же заголовками, что приносит мне контент правильно.
эти запросы работали нормально через c# около 4 дней назад, и я внезапно начал проблемы, но учитывая тот факт, что он хорошо реагирует на Postman, я не могу понять, в чем проблема.
вот ответ
EDIT: сделал оба запроса с прослушиванием скрипача. Результат для Postman показывает прямой запрос к API с HTTPS. При попытке с моим ConsoleApplication он показывает HTTP-запрос, который делает туннель к конечной точке API, порту 443.
TextView от Fiddler для запроса туннеля говорит следующее:
Я заметил поле "время", которое относится к очень старой дате, но я не знаю, что это значит.
5 ответов
вы можете попробовать код ниже:
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);
это своего рода плохая практика, чтобы включить Tls12, как это -
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
в будущем, если вам нужно будет использовать более высокую версию TLS, вам придется обновить свой код.
Если вы используете более старую версию .NET, вы можете просто переключить ее более высокую версию, в которой tls12 включен по умолчанию.
например, это простое изменение в вашей сети.config автоматически включит Tls12 -
<httpRuntime targetFramework="4.6.1"/>
(в качестве ссылки для других, у кого такая же проблема) это также может быть результатом Двойной Прыжок проблема , где вы должны передать зачисленного пользователя (в пуле) на проходящий сервер или из одной среды в другую , в противном случае пользователь установлен в "анонимный/пользователь", и вы получите "существующее соединение было принудительно закрыто удаленным хостом.- Ошибка!--3-->
разобрался. Мне нужно было включить использование TLS1.2.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;