C# 存储获取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

我的应用程序使用Azure存储Blob将文件从远程存储下载到本地计算机

工作原理:

  • 计算机正在获取到Azure存储blob的URL(签名URL)为的队列消息
  • 发送GET以下载文件的应用程序。这是通过
    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,ValueTask
    1任务,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、ResultPredicates
    1 shouldRetryResultPredicates、Func
    5 onRetryAsync、Int32 permittedRetryCount、IEnumerable
    1 sleepDurationsEnumerable、Func
    4 sleepDurationProvider、Boolean ContinuenCapturedContext) 在Polly.AsyncPolicy
    1.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秒吗?