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

标签 c# .net azure timeout azure-blob-storage

我试图了解 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,表示没有最大时间。

您可以在这里查看:https://azure.github.io/azure-storage-java/index.html?com/microsoft/azure/storage/RequestOptions.html

查找 setMaximumExecutionTimeInMs 方法。

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

关于c# - Azure Blob 存储 .NET 客户端请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52850533/

相关文章:

c# - sbyte[] 的 AsBuffer()?

c# - .NET Stream 类是否设计不当?

c# - 右键单击部署时如何运行 --publish-local-settings?

azure - 管理 Azure 搜索 503

node.js - 您可以根据事件中心消息 header 属性有条件地触发 azure 函数吗?

c# - C# 类型系统是否可靠且可判定?

C# 检查对象是否属于仅在运行时已知的类型

c# - 使用 jquery ajax 将文件上传到跨域 WCF 服务

c# - 跟踪方法执行时间

c# - 使用 STA 时表单表现异常,线程耗时过长