【问题标题】:Best way to transfer files through a web service通过网络服务传输文件的最佳方式
【发布时间】:2011-02-02 23:29:39
【问题描述】:


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

我对如何做到这一点有两个想法,

一种是使用诸如 wget 之类的第 3 方 API 来下载文件。问题是我需要学习 API 命令并且我不确定我可以在程序中显示我的下载进度,另一个问题是我必须使用裸 URL 从服务器获取文件看起来很丑陋,可能导致人们只是从服务器上下载它们(我希望他们获得授权,尽管这不是一个真正的问题,因为这只是一个学校项目)。

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

【问题讨论】:

  • .NET 的哪个版本? WCF 的功能与 ASMX Web 服务的功能非常不同。
  • 我不确定,该文件是 asmx 文件,所以我猜是这样。

标签: c# web-services download wget


【解决方案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 来使其更加健壮,如果 StartdownloadAt 设置为 0,则不执行 AddRange。完全支持范围,您可能需要开始和结束范围等属性。

当然,客户端必须在下载完成后将不同的下载片段拼接在一起。

关键是,通过使用WebClient 类应该可以,只需一点工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多