2

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

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

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

换句话说,我尝试在实际数据传输之前执行 BlobContainer.FetchAttributes 以检查 Internet 连接。如果没有连接,我不想在它超时并引发异常之前等待 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);

任何一个选项都不起作用!!

4

1 回答 1

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)。

于 2012-10-08T10:54:59.500 回答