Azure StorageClient客户端超时

时间:2012-10-08 10:22:49

标签: wpf azure timeout storage blob

提前感谢您的时间和帮助。

我正在使用Azure客户端库(即CloudStorageAccount - CloudBlobClient - CloudBlob)在WPF应用程序中下载/上传blob。

我想在我的WPF客户端应用程序中设置一个超时会话,以中止尝试获取云blob。这与我可以在blob传输会话上设置的服务器端超时不同。我想这样做,因为使用应用程序的互联网连接具有非常不稳定的间歇性连接。

换句话说,我尝试在实际数据传输之前执行BlobContainer.FetchAttributes来检查互联网连接。如果没有连接,我不想在超时之前等待90多秒并抛出异常。

我已经尝试在BlobRequestOptions中设置超时但这不起作用,因为只有在我连接后它才适用。

我是否理解设置错误或者我需要设置/配置/代码以实现更快的超时?

我可以在Fiddler中看到StorageClient库在幕后使用HTTP,并且根据我读过的一些帖子,我尝试在app.config中设置超时,如下所示。这也不起作用。

<configuration>
  <system.web>
    <httpRuntime executionTimeout="5" />  
  </system.web>
</configuration>

使用BlobRequest选项的示例超时:

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
blobContainer = blobClient.GetContainerReference("abcd");
CloudBlob blob = blobContainer.GetBlobReference(aCloudPath);
BlobRequestOptions bro = new BlobRequestOptions() 
                           { Timeout = TimeSpan.FromSeconds(5) };
blob.DownloadToFile(aLocalPath, bro);

这两个选项都不起作用!!

1 个答案:

答案 0 :(得分:3)

首先,在app.config中更改httpRuntime executionTimeout将不起作用。这是ASP.NET使用服务器端的设置。

其次,使用BlobRequestOptions的代码应该有效,但有一点需要注意。默认情况下,BlobClient附带一个指数退避重试策略来处理瞬态条件(即:无网络访问)。在每次重试之间它会等待一段时间然后重试。

如果要在尝试检查网络访问时禁用此功能,则只需禁用重试策略:

        blobClient.RetryPolicy = () =>
        {
            return (int currentRetryCount, Exception lastException, out TimeSpan retryInterval) =>
            {
                retryInterval = TimeSpan.Zero;
                return false;
            };
        };

请务必仅在测试网络访问时禁用此功能,请勿针对实际请求禁用此功能。

哦,顺便说一下,为什么不简单地使用已经存在的东西来检查互联网连接? Windows中有一些API,例如InternetCheckConnection

如果您的连接不稳定,最好改进重试策略而不是禁用它(例如,请查看TOPAZ)。