2

我有一个 Silverlight 4 浏览器外应用程序,如果下载因任何原因中断,该应用程序需要能够恢复外部文件的下载。我希望能够恢复而不是从头开始重新启动,因为文件会相当大,而且我们有可能让用户使用较慢的连接。

我找到了一些代码,

http://www.codeproject.com/Tips/157532/Silverlight-4-OOB-HTTP-Download-Component-with-Pau.aspx

但它似乎有很多错误,所以我不完全相信我能够让它工作。

因此,如果有人有任何其他原创建议或替代方案,我想听听他们的意见。

谢谢,

4

1 回答 1

4

您可能考虑的一种方法是使用 HTTP/1.1Acccept-Ranges响应标头和Range请求标头管理下载。

确保您正在下载的资源将包含标题:-

接受范围:字节

当它被请求时(默认情况下,IIS 发送的静态文件会执行此操作)。

现在使用 ClientHTTP 堆栈,您发出一个初始的“HEAD”请求,以确定服务器将接受Range: bytes=请求中的标头并找到要发送的内容的总大小。

然后,您对包含标头的资源发出“GET”请求:-

范围:字节=0-65535

这将下载的内容限制为仅前 64K 块。然后,您重复相同的请求:-

范围:字节=65536-131071

每次您都可以将响应流的内容保存到目标文件中。您跟踪收到的字节数。当您确定可能未满的最终块时,只需使用以下标头:-

范围:字节=131072-

这将读到文件的末尾。

如果对服务器的请求失败,您可以在此序列中的适当点恢复。

您需要优雅地降级,如果服务器在初始“HEAD”请求中不包含Accept-Ranges标头,那么您只需下载整个文件。

于 2011-03-12T22:09:58.737 回答