Мое приложение использует Azure большие двоичные объекты для загрузки файлов из удаленного хранилища на локальный компьютер.
Как это работает:
- Устройство получает сообщение очереди с URL (подписанный URL) на Azure BLOB-объект хранилища.
- Приложение, отправляющее GET для загрузки файл. Это делается с помощью
HttpClient
. - Продолжается логика приложения 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 попыток были использованы, но файл не был загружен.
Что делать? Что еще я должен проверить?