2011-05-04 53 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用于将更新下载到您的计算机的内容)。