Azure Blob Storage .NET客户端请求超时

5

我正在尝试理解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的默认值似乎是无穷大)。
我也知道我可以传递一个ServerTimeout,但我的理解是这只是在Azure存储服务内部使用,如果网络中断将不适用。
我认为我特别需要的是针对向Blob存储发出的HTTP调用的每个请求超时,类似于HttpWebRequest上的超时。
(我已经在Azure Storage Client版本9.3.2中复现了我的问题)。
2个回答

0
根据我的SDK理解,超时默认由服务器端处理。我没有在MSDN中找到有关此事的任何信息,但是使用相同HTTP端点的Azure Java SDK指出:
默认的最大执行时间在客户端中设置,默认为空,表示没有最大时间限制。
您可以在此处检查:https://azure.github.io/azure-storage-java/index.html?com/microsoft/azure/storage/RequestOptions.html 查找 setMaximumExecutionTimeInMs 方法。
由于超时似乎由服务器处理且默认客户端没有默认超时值,因此当您拔掉路由器时请求永远不会结束,因为您无法捕获服务器端的超时。

此文档适用于Java。在C#中对应的属性是我之前提到的ServerTimeout。 - NitramAvfank
是的,我知道,但正如我所说,我在Java文档中找到的唯一关于默认超时时间的参考资料,MSDN没有提到。我只能假设两个平台的行为是相同的。这可能解释了你的问题。 - Léo D.
相应的属性不是ServerTimeout而是你也提到的MaximumExecutionTime。因此我认为这应该是解决方案,你不会错过像你担心的那样基本的东西。 - Léo D.

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中遇到了这个问题。我认为这个bug没有完全解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接