Хранилище, получающее капли TaskCanceledException - PullRequest
0 голосов
/ 21 января 2020

Мое приложение использует Azure большие двоичные объекты для загрузки файлов из удаленного хранилища на локальный компьютер.

Как это работает:

  1. Устройство получает сообщение очереди с URL (подписанный URL) на Azure BLOB-объект хранилища.
  2. Приложение, отправляющее GET для загрузки файл. Это делается с помощью HttpClient.
  3. Продолжается логика приложения c.

Вот как я загружаю файл:

HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Get, signedUrl);
HttpClient.Timeout = TimeSpan.FromSeconds(120);
var response = await HttpClient.SendAsync(msg);
response.EnsureSuccessStatusCode();

Я нашел что несколько раз в день я получал исключение:

System.Threading.Tasks.TaskCanceledException: операция была отменена. ---> System.IO.IOException: невозможно прочитать данные из транспортного соединения: операция отменена. ---> System. Net .Sockets.SocketException: операция отменена --- Конец трассировки стека внутреннего исключения --- в System. Net .Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException (ошибка SocketError) в System. Net .Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult (токен Int16) в системе. Net .Security.SslStreamInternal.g__InternalFillBufferAsync | 38_0 [TReadAdapter] (адаптор TRead *apapter, системный буфер 1 020 * 10 *). .HttpConnection.SendAsyncCore (запрос HttpRequestMessage, CancellationToken cancellationToken) --- Конец трассировки стека внутренней исключительной ситуации --- в System. Net .Http.HttpConnection.SendAsyncCore (запрос HttpRequestMessage, системный запрос * CancellationToken * Http0. .HttpConnectionPool.SendWithNtConnectionAuthAsyn c (соединение HttpConnection, запрос HttpRequestMessage, логическое значение doRequestAuth, CancellationToken cancellationToken) в системе. Net .Http.HttpConnectionPool.quetRequate h, CancellationToken cancellationToken) в System. Net .Http.RedirectHandler.SendAsyn c (запрос HttpRequestMessage, CancellationToken cancellationToken) в System. Net .Http.DecompressionHandler.SendAsyn * 10enTokateNoGenState_RegToken (запрос на отмену возврата) System. Net .Http.HttpClient.FinishSendAsyncBuffered (Задача 1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) at Polly.Retry.AsyncRetryEngine.ImplementationAsync[TResult](Func 3, контекстный контекст, CancellationToken cancellationToken, предикаты ExceptionPredicates ) в Polly.AsyncPolicy 1.ExecuteAsync(Func 3 действие, Контекст контекста, CancellationToken cancellationToken, Boolean continueOnCapturedContext)

На этом этапе я должен уточнить, что такое поведение происходит с ~ 0,1% URL-адресов, переданных в система.

Я подозревал, что проблема в подписанном URL. Я обнаружил, что во всех случаях подписанный URL-адрес был правильным - я просто поместил его в браузер, и он работал.

Теперь, когда я знаю, что проблема не в самом URL-адресе, я подумал, что это может быть проблема в сети. , Итак, используя Polly , я добавил 5 попыток с экспоненциальной задержкой между ними. До 5 попыток. Формула задержки - 3 ^ n (где n - количество повторов). В худшем случае он будет ждать 4 минуты, прежде чем пытаться снова ... И даже сейчас - все та же ошибка. Все 5 попыток были использованы, но файл не был загружен.

Что делать? Что еще я должен проверить?

1 Ответ

0 голосов
/ 21 января 2020

Кажется, проблема в сети. Я предлагаю вам использовать Azure Storage Client SDK для загрузки BLOB-объектов.

// Blob SAS URL
string url = "https://storagetest789.blob.core.windows.net/devops/deploy.ps1?sp=r&st=2020-01-21T09:39:06Z&se=2020-01-21T17:39:06Z&spr=https&sv=2019-02-02&sr=b&sig=tyGX6wpgAooOZK2Po2ntukF0fGx3PosSNTgkLlVysrE%3D";
CloudBlockBlob blob = new CloudBlockBlob(new Uri(url));
Console.WriteLine(blob.DownloadText());

Вы также можете загрузить в файл или в потоковый режим методами SDK. SDK может обрабатывать все основные элементы.

...