2014-01-28 58 views
2

我使用.net HttpClient,但這可能是一個更一般的HTTP問題: 我想允許用戶上傳大型文件,從有時緩慢和不可靠的移動連接。 如果上傳沒有在20秒內開始,那麼可能存在連接問題,因此應用程序應該採取適當的措施(例如,現在放棄並稍後再試。) 但是,如果上傳開始,則可能需要幾分鐘才能完成。在這種情況下,我不希望超時中斷它。然後我只想放棄並拋出一個錯誤,如果上傳進度速度減慢到爬行。HttpClient - 兩個超大上傳超時

所以看起來我想要兩個超時條件 - 初始連接超時20秒,上傳完成超時10分鐘(或最好動態計算)。

有沒有辦法做到這一點? HttpClient.Timeout似乎設置了整個上傳的限制,而不僅僅是初始連接。

我使用HttpClient.PutAsync(),並通過重寫HttpContent.SerializeToStreamAsync()來監視進度。如有必要,我可以在此功能中加入一個最小速度檢查,以便在進度太慢時終止。

乾杯。

回答

0

HttpClient上的超時不會對你有用。據我所知,無法區分連接時間和發送請求正文。

您最好的選擇是按照您的建議創建您自己的派生HttpContent,或者使用PushStreamContent。這將允許您監視發送進度。

假設你的服務器沒有返回連接:關閉你可以用打開TCP連接的HEAD請求命中服務器,然後你的第二個請求可以是PUT,它將重新使用TCP連接。至少你知道服務器是可用的。

+0

但是,由於一些未知的原因,PutAsync重載沒有采取HttpCompletionOption。這是否意味着我需要使用SendAsync?我會怎麼做?我找不到使用HttpClient方法的示例。 – thund

+0

因此,在上面的代碼中,我該如何使用響應變量來執行實際上傳? (帶進度報告)。我在WebRequest或HttpClient.PutAsync中使用的方法在這種情況下似乎不適用。 – thund

+0

@thund我添加了一個更新,希望這是足夠的細節讓你去。 –