2012-10-08 125 views
2

预先感谢您的时间和协助。Azure StorageClient客户端超时

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

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

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

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

我了解设置错误还是有其他需要设置/配置/代码来实现更快的超时?

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

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

样品超时:

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

要么选择不工作!

回答

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

+0

谢谢Sandrino。我现在知道如何处理我的问题。 –

+2

我相信这是一个更简单的方法来禁用重试:'blobClient.RetryPolicy = RetryPolicies.NoRetry();' –

+0

好!完全忘记了NoRetry –