C# 存储获取Blob任务取消异常
我的应用程序使用Azure存储Blob将文件从远程存储下载到本地计算机 工作原理:C# 存储获取Blob任务取消异常,c#,azure,httpclient,azure-storage-blobs,C#,Azure,Httpclient,Azure Storage Blobs,我的应用程序使用Azure存储Blob将文件从远程存储下载到本地计算机 工作原理: 计算机正在获取到Azure存储blob的URL(签名URL)为的队列消息 发送GET以下载文件的应用程序。这是通过HttpClient完成的 应用程序逻辑从此处继续 以下是我下载文件的方式: HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Get, signedUrl); HttpClient.Timeout = TimeSpan.FromSe
HttpClient
完成的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.ThroweException(SocketError错误)
位于System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16令牌)
在System.Net.Security.SslStreamInternal.g_uuInternalFillBufferAsync | 38_0[TReadAdapter](TReadAdapter adap,ValueTask1任务,Int32分钟,Int32初始)
位于System.Net.Security.SslStreamInternal.ReadAsyncInternal[TReadAdapter](TReadAdapter适配器,内存
1缓冲区)
位于System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage请求,CancellationToken CancellationToken)
---内部异常堆栈跟踪的结束---
位于System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage请求,CancellationToken CancellationToken)
在System.Net.Http.HttpConnectionPool.SendWithNtConnectionAuthAsync(HttpConnection连接,HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken CancellationToken)
位于System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage请求,布尔值doRequestAuth,CancellationToken CancellationToken)
位于System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
位于System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
在System.Net.Http.HttpClient.FinishSendAsyncBuffered(任务1 sendTask,HttpRequestMessage请求,取消令牌源cts,布尔处理)
在Polly.Retry.AsyncRetryEngine.ImplementationAsync[TResult](Func
3操作、上下文上下文、CancellationToken CancellationToken、ExceptionPredicates shouldRetryExceptionPredicates、ResultPredicates1 shouldRetryResultPredicates、Func
5 onRetryAsync、Int32 permittedRetryCount、IEnumerable1 sleepDurationsEnumerable、Func
4 sleepDurationProvider、Boolean ContinuenCapturedContext)
在Polly.AsyncPolicy1.ExecuteAsync(Func
3操作、上下文上下文、取消令牌取消令牌、布尔连续捕获上下文)
在这一点上,我必须澄清,这种行为发生在系统中传递的约0.1%的URL上
我怀疑问题出在已签名的URL上。我发现在所有情况下,已签名的URL都是正确的-我只是把它放在浏览器中,它就工作了
现在,当我知道问题不是URL本身时,我认为这可能是一个网络问题。因此,通过使用,我添加了5次重试,每次重试之间有指数延迟。最多5次重试。延迟公式-3^n(其中n是重试次数)。在最坏的情况下,它将等待4分钟再重试…即使现在-仍然是相同的错误。所有5次重试都已使用,但文件未下载
怎么办?我还应该检查什么?似乎是网络问题。我建议您使用Azure存储客户端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可能会处理所有底层内容。似乎是网络问题。我建议您使用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可以处理所有底层内容。失败的blob大小是多少?一个blob大约为3mb…我注意到您已将超时设置为120秒。您可以尝试将其增加到300秒吗?失败的blob大小是多少?大约3mb我注意到你把超时设置为120秒。你能试着把它增加到300秒吗?