我的C#程序使用Web服务与服务器通信,我需要客户端从服务器下载大文件,并且可以选择暂停并继续下载,下载器也必须被授权下载文件。
我有两个关于如何做到这一点的想法,
一个是使用像wget这样的第三方API来下载文件。问题是我需要学习API命令,而且我不确定我是否可以在程序中显示我的下载进度,另一个问题是我必须使用使用裸URL从服务器获取文件看起来很难看,可能导致人们只是将它们从服务器上下载(我希望它们被授权,虽然这不是一个真正的问题,因为这只是一个学校项目)。
我的另一个想法是在Web服务上创建一个方法,它将获取文件中的位置和一定量的字节并返回它们,客户端将它们拼凑在一起,看起来更复杂但更具吸引力,因为用户必须被授权下载文件,我可以用它来向测试人员展示一些更高级的编程技巧;)。这个问题看起来可能是性能征税 你怎么看?什么是从服务器下载大文件的最佳方式?
答案 0 :(得分:1)
如果不需要授权和部分下载,WebClient.DownloadData
或WebClient.DownloadDataAsync
将是从服务器下载文件的首选方法。
您仍然可以通过在WebClient
对象实例中设置Credentials
来使用WebClient
进行授权。如果用户无权下载该文件,则根据这些凭据,服务器可以返回404(未找到)或403(禁止)。
如果您的服务器支持HTTP 1.1,则客户端可以在文件中间启动。为此,您必须创建一个继承自WebClient
的类并覆盖GetWebRequest
方法。然后,该方法将标题设置为执行位置GET。
class MyWebClient : WebClient
{
public int StartDownloadAt { get; set; }
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
req.AddRange(position_to_start);
}
}
在使用它的代码中:
MyWebClient client = new MyWebClient();
client.StartDownloadAt = 1024 * 2024; // start download 1 megabyte into file.
client.DownloadData(...);
以上只是一个例子。您可能希望通过在下载完成(或中止)时将StartDownLoadAt
属性重置为0来使其更加健壮,如果将AddRange
设置为StartdownloadAt
,则不要执行WebClient
0.要完全支持范围,您可能需要开始和结束范围等属性
当然,客户端必须在下载完成后处理拼凑出的不同下载部分。
关键是,通过使用{{1}}类,可以通过一点点工作。