Невозможно прочитать данные из транспортного соединения на полпути к загрузке файла

#c# #get #dotnet-httpclient

Вопрос:

Я столкнулся с интересной проблемой при попытке использовать функцию HttpClient GetAsync. Указанный URL-адрес работал до прошлых выходных без каких-либо изменений с нашей стороны, и все работает нормально локально, но при развертывании на наших тестовых или производственных серверах происходит сбой на полпути при загрузке, когда невозможно прочитать данные из транспортного соединения.

В настоящее время я получаю ответ с помощью

 response = await client.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);
 

и как только я получу ответное сообщение (поскольку это просто чтение заголовков) Затем я загружаю его в файл в локальной файловой системе.

 //Write the response to file
using (Stream streamToReadFrom = await httpResponse.Content.ReadAsStreamAsync())
{
   using (Stream streamToWriteTo = File.Open(fileToWriteTo, FileMode.Create))
   {
       await streamToReadFrom.CopyToAsync(streamToWriteTo);
   }
}
 

Проблема в том, что во время потоковой передачи данных он случайным образом выдает сообщение «Невозможно прочитать данные из транспортного соединения: соединение было закрыто». Поскольку файл передается в потоковом режиме, я могу видеть содержимое и размер файла на диске, и он загружает только где-то от 20-30% файла. Я могу загрузить файл, используя браузер (Chrome, Firefox и Edge), Postman и запустив программу локально на своем компьютере. Я также могу загрузить его ЧЕРЕЗ Edge НА тестовом сервере в файловую систему, что для меня исключает любую проблему с брандмауэром.

Я пробовал

  • Изменение HttpCompleteOption.ResponseContentRead, но он завершается с той же ошибкой, поскольку он пытается получить все содержимое перед записью его в файл.
  • Добавлены следующие параметры конфигурации (время загрузки составляет 4 часа)
     client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
    client.DefaultRequestHeaders.Add("Keep-Alive", DOWNLOAD_TIMEOUT.TotalSeconds.ToString());
    client.Timeout = DOWNLOAD_TIMEOUT; //Set the max download wait time for the client
    System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; //Accept 1 and 1.2 TLS
     

При выполнении потока файлов я получаю файлы, которые заполнены до 13120KB, 13296KB, 7536KB и т.д. Фактический размер, соответствующий тому, что я загружаю из Postman и браузера, составляет 50654 КБ.

Не уверен, что вызывает сбой в середине загрузки, когда все другие методы все еще работают (особенно на моем локальном компьютере). Я не верю, что это ошибка Tls / Ssl, поскольку он может подключаться и загружать часть файла, и я не верю, что это проблема с брандмауэром на тестовом и производственном сервере, поскольку я могу попасть в эту конечную точку и загрузить ее на соответствующие серверы.

Любая помощь будет оценена!

РЕДАКТИРОВАТЬ: то, что делает это уникальным по сравнению с другими вопросами SO, заключается в том, что я могу подключить и загрузить ~ 30% файла, прежде чем я получу сообщение об ошибке «Невозможно прочитать данные из …». Многие другие вопросы возникают при попытке подключиться к URL-адресу, тогда как я получаю его после успешного подключения и начала загрузки файла.

Комментарии:

1. Вы можете использовать мой удивительный загрузчик поддержки резюме (управляемый событиями) github.com/amiru3f/deathnight-downloader

Ответ №1:

Если вы хотите быть уверенным в том, что справитесь с проблемами инфраструктуры, вы могли бы попробовать какой-нибудь защищенный httpclient. Загрузчик выглядит довольно многообещающе. Ему удается продолжить загрузку после прерванных сетевых подключений.

 await DownloadBuilder.New().WithUrl(@"https://file-examples-com.github.io/uploads/2018/04/file_example_AVI_1920_2_3MG.avi").WithDirectory(@"C:temp").Build().StartAsync();
 

Комментарии:

1. Этот конкретный URL-адрес работал без изменений в развернутом коде вплоть до прошлых выходных, когда начался сбой. С нашей стороны никаких изменений внесено не было, но соединение прерывается после загрузки ~ 30% файла. Файл по-прежнему отлично загружается при локальном запуске только в двух развернутых средах, одним из моих ограничений здесь является использование библиотеки HttpClient.

2. Ваше наблюдение о том, что ваш код работал до прошлой недели, наводит на подозрение, что существует проблема с сетевой инфраструктурой. В зависимости от ваших настроек более надежный httpclient решит эту проблему. По крайней мере, это исключило бы, что причиной является сетевая инфраструктура. Итог: это попытка с наименьшими усилиями. Даже если вы выясните, какой сетевой компонент вызывает проблемы с подключением, вы можете оказаться в ситуации, когда вы не сможете повлиять на это

Ответ №2:

Трудно сказать, но:

  • может быть какая-то антивирусная активность (отключить и повторить тест),
  • возможно, Windows обновляется (на стороне сервера / клиента)? Это Windows? 🙂
  • проверить сертификаты (срок действия и т. Д.)?
  • проверьте это поведение с другого компьютера в сети
  • отключить проверку ssl в .net
  • используйте другую библиотеку, например RestSharp, и посмотрите, существует ли ошибка
  • включить перехват сети (скрипач)?