通过Web服务传输文件的最佳方式

时间:2011-02-02 23:29:39

标签: c# web-services download wget


我的C#程序使用Web服务与服务器通信,我需要客户端从服务器下载大文件,并且可以选择暂停并继续下载,下载器也必须被授权下载文件。

我有两个关于如何做到这一点的想法,

一个是使用像wget这样的第三方API来下载文件。问题是我需要学习API命令,而且我不确定我是否可以在程序中显示我的下载进度,另一个问题是我必须使用使用裸URL从服务器获取文件看起来很难看,可能导致人们只是将它们从服务器上下载(我希望它们被授权,虽然这不是一个真正的问题,因为这只是一个学校项目)。

我的另一个想法是在Web服务上创建一个方法,它将获取文件中的位置和一定量的字节并返回它们,客户端将它们拼凑在一起,看起来更复杂但更具吸引力,因为用户必须被授权下载文件,我可以用它来向测试人员展示一些更高级的编程技巧;)。这个问题看起来可能是性能征税 你怎么看?什么是从服务器下载大文件的最佳方式?

1 个答案:

答案 0 :(得分:1)

如果不需要授权和部分下载,WebClient.DownloadDataWebClient.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}}类,可以通过一点点工作。