我试图了解在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版中转载了我的问题)
答案 0 :(得分:0)
根据我对SDK的了解,默认情况下,超时是在服务器端处理的。我没有在MSDN上找到与此有关的任何内容,但是Azure Java SDK(使用相同的HTTP终结点)说:
默认最大执行时间是在客户端中设置的,默认情况下为null,表示没有最大时间。
寻找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的问题。我认为该错误尚未完全解决。