我有很多代碼片段可以正確地從網上下載x/html頁面和文件,而且他們 - 大部分 - 工作得很好。C#健壯的網絡連接處理Flask網絡
不幸的是,我的家庭互聯網連接在午夜和上午6點之間幾乎無法使用。我收到很多數據包丟失和停滯的連接。同樣,我有一個備用的3G連接,因爲網絡負載而導致間歇性中斷。
當然,我可以將下載代碼放入try/catch中 - 但理想情況下,我希望文件能夠正確下載,無論需要多長時間。
我嘗試了很多事情來解決這個問題,並且取得了不同的成功。
我已經嘗試獲取我捕獲的流的長度,並驗證我的本地副本是相同的長度。出於某種原因,(正確下載的)本地副本總是比流的報告長度短几十個字節,但實際縮短的數量似乎有所不同。而且,並非所有的流都具有可用的長度。
我也嘗試將我的try/catch'd段放入for循環中 - 使其嘗試下載,例如50次。一個成功的下載將會中斷,而一個失敗的將會再次嘗試。
我增加了上面的逐漸增加的延遲 - 我有一個Thread.Sleep(),它會在每次迭代中逐漸睡眠更長和更長的時間,然後重試。
我想這個任務並不像聽起來那麼簡單,因爲我的很多個人軟件 - Steam,Chrome,Windows Update,iTunes等......似乎都無法處理我的脆弱連接。我經常必須在成功下載之前嘗試下載大文件10-15次。這些開發人員不關心處理連接問題,或者很難做到。
如果可能的話,有人可以提供一個代碼片段,它將從互聯網上抓取一個流,但會處理片狀連接?
我想它應該是這樣的:
public static MemoryStream Fetch(string url, int? maxRetries, int? maxDuration)
{
// Download the response of the url to a MemoryStream.
// Assume if null maxRetries and maxDuration, keep trying forever.
}