C# 通过web服务传输文件的最佳方式

C# 通过web服务传输文件的最佳方式,c#,web-services,download,wget,C#,Web Services,Download,Wget,我的C#程序使用web服务与服务器通信,我需要客户端从服务器下载大文件,并可以选择暂停并继续下载,下载程序还必须获得下载文件的授权 关于如何做到这一点,我有两个想法 一种是使用一些第三方API,比如wget来下载文件。问题是我需要学习API命令,我不确定我是否能在程序中显示我的下载进度,另一个问题是我必须使用裸URL从服务器获取文件,这看起来很难看,可能会导致人们从服务器下载文件(我希望他们得到授权,尽管这不是一个真正的问题,因为这只是一个学校项目) 我的另一个想法是在web服务上创建一个方法,


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

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

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

我的另一个想法是在web服务上创建一个方法,该方法将获得文件中的位置和字节数,并返回它们,客户端将它们拼凑在一起,这似乎更复杂,但更引人注目,因为用户必须获得下载文件的授权,我可以使用它向测试人员展示一些更高级的编程技巧疾病;)。这样做的问题似乎是性能负担。

你怎么看?从服务器下载大文件的最佳方法是什么?

如果不需要授权和部分下载,
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(...);
以上只是一个例子。您可能希望在下载完成(或中止)时将
startdownloadt
属性重置为0,而不是在
startdownloadt
设置为0时执行
AddRange
操作,从而使该功能更加健壮。要完全支持范围,您可能需要开始和结束范围等的属性

当然,在下载完成后,客户端将不得不处理将不同的下载片段缝合在一起的问题


要点是,通过使用
WebClient
类,只需做一点工作就可以了。

不需要授权和部分下载,
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(...);
以上只是一个例子。您可能希望在下载完成(或中止)时将
startdownloadt
属性重置为0,而不是在
startdownloadt
设置为0时执行
AddRange
操作,从而使该功能更加健壮。要完全支持范围,您可能需要开始和结束范围等的属性

当然,在下载完成后,客户端将不得不处理将不同的下载片段缝合在一起的问题


关键是,通过使用
WebClient
类,只需做一点工作,就可以做到这一点。

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