"Базовое соединение закрыто: непредвиденная ошибка при передаче.". Почтальон идет нормально с теми же заголовками

сценарий

  • 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, я не могу понять, в чем проблема.

вот ответ

enter image description here

EDIT: сделал оба запроса с прослушиванием скрипача. Результат для Postman показывает прямой запрос к API с HTTPS. При попытке с моим ConsoleApplication он показывает HTTP-запрос, который делает туннель к конечной точке API, порту 443.

enter image description here

TextView от Fiddler для запроса туннеля говорит следующее:

enter image description here

Я заметил поле "время", которое относится к очень старой дате, но я не знаю, что это значит.

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;

Я нашел ту же ошибку, просто упомяну запрос.UserAgent = "все, что вы хотите";