2015-02-09 137 views
0

我有一種將文件上傳到Azure的方法到我的存儲帳戶。我的方法很簡單有沒有辦法阻止Azure存儲PutBlock方法超時?

blob = new CloudBlockBlob(new Uri(Uri)); 
var ms = new MemoryStream(block.Data); 
blob.PutBlock(block.BlockId, ms, null) 

但有時我PutBlock拋出一個異常:

行動已在 Microsoft.WindowsAzure超時

堆棧跟蹤

.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1 cmd,IRetryPolicy policy,OperationContext operationContext)\ r \ n at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.PutBlock(String blockId,Stream blockData ,字符串contentMD5,AccessCondition accessCondition,BlobRequestOptions選項的OperationContext 的OperationContext)

內部異常堆棧跟蹤

在System.Net.HttpWebRequest.GetRequestStream(了Transpo rtContext & 上下文)\ r \ n在System.Net.HttpWebRequest.GetRequestStream(個)\ r \ n
在 Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T](RESTCommand`1 CMD, IRetryPolicy政策,OperationContext操作上下文)「

這通常發生在我異步上傳一次說40個文件並且文件已經造成瓶頸。我顯然現在一次只限制一個文件。但我想知道爲什麼會發生這種情況,並且如果有防止它的方法,以便我知道它不會再發生,說一個普遍較慢的互聯網連接?

回答

1

有幾件事情,你可以嘗試:

  • 減少並行上傳數量:您可以通過減少並行上傳的數量來表示邏輯處理器數量(嘗試或可能是一半那)。例如,如果你有8個核心處理器,那麼你可以嘗試上傳4到8個並行文件。根據我的經驗,並行上傳更多文件實際上會減慢速度。從我所瞭解的情況來看,正在發生大量的上下文切換。
  • 減小塊大小:您可以嘗試減小塊大小。
  • 增加請求超時:如果我沒有弄錯,web請求中的默認請求超時是100秒(https://msdn.microsoft.com/en-us/library/system.net.webrequest.timeout%28v=vs.110%29.aspx)。你可以嘗試增加。這將處理客戶端的超時。有一個服務器端請求超時,默認情況下是30秒(有一些例外)。您可以在這裏閱讀有關服務器端超時的更多信息:https://msdn.microsoft.com/en-us/library/azure/dd179431.aspx如果我沒有弄錯,默認的請求超時是90秒。您可以嘗試增加超時時間。您可以在PutBlock方法中指定它的ServerTimeout屬性BlobRequestOptions參數。
+0

這些都是很好的一點。我已經將並行上傳次數減少到1次,所以希望這可以減少發生的機會。我也可以嘗試減小塊的大小,目前每塊是512字節。你怎麼知道默認超時是90秒?我試圖爲自己找到這個,但發現無用的 – user1 2015-02-09 12:24:14

+0

蔚藍api上的msdn文檔更新了我的答案。 HTH。 – 2015-02-09 12:39:14

+0

我只想爲遇到此問題的任何人添加此處。從我一直在看的Azure API沒有辦法增加默認的請求超時以及我的stacktrace的外觀,這是錯誤被拋出的地方。因此,我將嘗試減少塊大小和並行上傳數量。謝謝您的幫助 – user1 2015-02-09 14:37:26

相關問題