我有很多代码片段可以正确地从网上下载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.
}