Azure Blob存储.NET客户端请求超时

时间:2018-10-17 08:34:31

标签: c# .net azure timeout azure-storage-blobs

我试图了解在Azure Storage .NET客户端中处理网络错误的行为。简而言之,我的问题是:

如果我从blob存储区下载blob时拔了网线,则我的应用程序将挂起至少30分钟(这是我的耐心持续了多长时间-可能会挂起更长的时间)。

例如,如果我使用以下代码(我尚未在blob客户端本身上配置任何设置),就会发生这种情况。

...

var blockBlob = container.GetBlockBlobReference("myblob.data");

var blobRequestOptions = new BlobRequestOptions()
    {
        RetryPolicy = new NoRetry(),
    };

using (var stream = new MemoryStream())
{
    blockBlob.DownloadToStream(stream, null, blobRequestOptions);
}

我知道我可以在BlobRequestOptions中配置 MaximumExecutionTime 属性,但是对于我来说,如果网络连接下降,默认行为是无限期地挂起,这让我感到有些奇怪。这使我怀疑我缺少有关应该如何使用客户端的基本信息。 (MaximumExecutionTimeout的默认值似乎是Infinite)。

我也知道我可以传递ServerTimeout,但是我的理解是,它在Azure存储服务中内部使用,并且在网络中断的情况下不适用。

我想寻找的是针对Blob存储的HTTP调用的每个请求超时。像HttpWebRequest上的超时之类的。

(我在Azure存储客户端9.3.2版中转载了我的问题)

2 个答案:

答案 0 :(得分:0)

根据我对SDK的了解,默认情况下,超时是在服务器端处理的。我没有在MSDN上找到与此有关的任何内容,但是Azure Java SDK(使用相同的HTTP终结点)说:

默认最大执行时间是在客户端中设置的,默认情况下为null,表示没有最大时间。

您可以在此处进行检查:https://azure.github.io/azure-storage-java/index.html?com/microsoft/azure/storage/RequestOptions.html

寻找setMaximumExecutionTimeInMs方法。

由于超时似乎是由服务器处理的,并且默认客户端没有默认超时值,因此在拔掉路由器时请求永不结束是有道理的,因为您将无法捕获服务器端的超时

答案 1 :(得分:0)

我发现存储sdk团队确实已经确认并解决了v8.1.3中的此错误,如更改日志所示: https://github.com/Azure/azure-storage-net/blob/dfc88329b56ef022e38f2d39d709ddc2b41fe6a0/Common/changelog.txt

Changes in 8.1.3 :
- Blobs (Desktop) : Fixed a bug where the MaximumExecutionTime was not honored, leading to infinite wait, if due to a failure, e.g., a network failure after receiving the response headers, server stopped sending partial response.

提交:https://github.com/Azure/azure-storage-net/pull/459/commits/ad8fd6ad3cdfad77cfe23afe16f1f96c04ad90ee

但是,您的主张是可以在9.3.2中重现此内容。我也看到了11.1.1的问题。我认为该错误尚未完全解决。