В процессе загрузки нескольких файлов из большого двоичного объекта на SFTP-сервер возникают сбои, и завершение загрузкиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 В процессе загрузки нескольких файлов из большого двоичного объекта на SFTP-сервер возникают сбои, и завершение загрузки

Сообщение Anonymous »


В процессе загрузки нескольких файлов из хранилища BLOB-объектов на SFTP-сервер возникает повторяющаяся проблема, характеризующаяся исключениями времени ожидания сокета. Renci.SshNet.Common.SshConnectionException: в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e) в Renci.SshNet.Session.WaitOnHandle (Renci.SshNet, Version=2024.0.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106)

Происшествие связано с тайм-аутом соединения, несмотря на то, что SFTP-клиент закрывает соединение после каждой попытки загрузки.

Предлагаемое решение включает в себя:

1. Получение нескольких файлов из большого двоичного объекта с использованием префикса. 2. Перебираем каждый файл, загружая его в поток памяти. 3. Установление SFTP-соединения и загрузка файла. public async Task DownloadListOfFiles (журнал ILogger, строковый префикс, int? сегментSize) { Боул isSuccess = правда; пытаться { // Вызов операции листинга и возврат страниц указанного размера. var resultSegment =ContainerClient.GetBlobsByHierarchyAsync (префикс: префикс, разделитель: «/») .AsPages(по умолчанию, SegmentSize); // Перечисляем BLOB-объекты, возвращаемые для каждой страницы. ожидайте foreach (Page blobPage в resultSegment) { // Иерархический список может возвращать как виртуальные каталоги, так и большие двоичные объекты. foreach (BlobHierarchyItem blobhierarchyItem в blobPage.Values) //Parallel.ForEach(blobPage.Values, blobhierarchyItem => { если (blobhierarchyItem.IsPrefix) { // Рекурсивный вызов с префиксом для обхода виртуального каталога. ждут DownloadListOfFiles (журнал, blobhierarchyItem.Prefix, null); } еще { // Записываем имя большого двоичного объекта. var blobClient =ContainerClient.GetBlobClient(blobhierarchyItem.Blob.Name); строка FileName = blobhierarchyItem.Blob.Name; var RemoteFilePath = $"SFTPPath/{FileName}"; используя (var поток = новый MemoryStream()) { ждут blobClient.DownloadToAsync(поток); поток.Позиция = 0; дождитесь PostToSFTP(stream.ToArray(), log, RemoteFilePath); } } }; } } поймать (RequestFailedException e) { isSuccess = ложь; } возврат isSuccess; } частная асинхронная задача PostToSFTP (byte[] fileBytes, журнал ILogger, строка RemoteFilePath) { Боул isSuccess = правда; // Создаем объект клиента SFTP, используя хост, порт, имя пользователя и пароль используя (SftpClient sftpclient = новый SftpClient(SFTPHost, SFTPPort, SFTPUserName, SFTPPassword)) { пытаться { // Подключаемся к серверу сфтпклиент.Соединиться(); sftpclient.KeepAliveInterval = новый TimeSpan(0, 1, 0); sftpclient.OperationTimeout = новый TimeSpan(0, 1, 0); используя (поток потока = новый MemoryStream(fileBytes)) { // Загрузите файл по удаленному пути sftpclient.UploadFile(поток, RemoteFilePath, правда); } sftpclient.Disconnect(); } поймать (SshException ex) { sftpclient.Disconnect(); isSuccess = ложь; if (ex.InnerException != null && ex.InnerException.Message.Contains("Истекло время ожидания операции чтения сокета")) { Thread.Sleep(100); } } поймать (Исключение ex) { // Закрываем поток и соединение sftpclient.Disconnect(); isSuccess = ложь; } окончательно { // Закрываем поток и соединение sftpclient.Disconnect(); sftpclient.Dispose(); } } } Процесс загрузки 60 небольших файлов из хранилища BLOB-объектов на SFTP-сервер занимает значительно больше времени, чем ожидалось: среднее время загрузки составляет около 5 минут. Кроме того, операция прерывается из-за нескольких исключений тайм-аута сокета, что еще больше снижает эффективность и надежность процесса.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»