2011-05-04 84 views
1

我有很多代碼片段可以正確地從網上下載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. 
} 

回答

0

我會建議尋找到一個現有的解決方案。我的第一個想法是使用BITS或外殼Robocopy。兩者都經過審查,可能會在潛在不穩定的網絡中下載文件(BITS是Windows Update用於將更新下載到您的計算機的內容)。