我试图了解 Azure 存储 .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 存储客户端版本 9.3.2 中重现了我的问题)
最佳答案
根据我对SDK的理解,超时是默认在服务器端处理的。我在 MSDN 上没有找到任何与此相关的内容,但 Azure Java SDK(使用相同的 HTTP 端点)说:
默认最大执行时间是在客户端设置的,默认为null,表示没有最大时间。
查找 setMaximumExecutionTimeInMs 方法。
由于超时似乎是由服务器处理的,并且默认客户端没有默认超时值,因此当您拔掉路由器时,请求永远不会结束是有道理的,因为您将无法捕获服务器端超时.
关于c# - Azure Blob 存储 .NET 客户端请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52850533/