2012-10-08 123 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 –