4

我正在使用 C# .Net 在 Visual Studio 2010 中编写程序

该程序是将文件从给定的 url 保存到本地驱动器,并带有自定义超时以节省时间。

假设 url 是http://mywebsite.com/file1.pdf,我想将文件保存到目录C:\downloadFiles\

目前,我正在使用WebClient.

WebClient.DownloadFile("http://mywebsite.com/file1.pdf", "C:\downloadFiles\file1.pdf");

我可以保存文件,但遇到了一些问题。

有时,网址只是没有响应,所以我让我的程序在终止之前尝试下载 5 次。然后我意识到 WebClient 的默认超时对于我的需要来说太长了(比如 2 分钟或其他东西) 有没有一种简单的方法可以将超时设置得更短,比如 15 秒?

我也调查了一下HttpWebRequest,我可以很容易地设置超时HttpWebRequest.Timeout = 15000;。但是,使用这种方法,我不知道如何下载/保存文件。

所以我的所有问题是:哪个更简单,设置超时WebClient或使用保存文件HttpWebRequest?我该怎么做呢?

4

4 回答 4

12

您可以创建自己的 WebClient

public class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var req = base.GetWebRequest(address);
        req.Timeout = 15000;
        return req;
    }
}
于 2013-06-28T18:05:29.020 回答
4

HttpClient如果您使用的是 .NET 4.5,则可以使用该类:

using(var httpClient = new HttpClient())
{
    httpClient.Timeout = new TimeSpan(0, 0, 15);

    Stream response = await httpClient.GetStreamAsync("http://mywebsite.com/file1.pdf");

    ...
}

这是一个在 LinqPad 中得到json响应的示例:http: //share.linqpad.net/aaeeum.linq

于 2013-06-28T18:18:14.067 回答
1

没有直接的方法可以用WebClient. 但你可以WebClient.DownloadFileAsync()改用。这将允许您CancelAsync()在需要时使用。

于 2013-06-28T18:05:44.820 回答
0

在 .net 4 及更高版本中,您可以执行类似的操作

var wreq = WebRequest.Create("http://mywebsite.com/file1.pdf");
wreq.Timeout = 15000;

var wresp = (HttpWebResponse)request.GetResponse();

using (Stream file = File.OpenWrite("path/to/output/file.pdf"))
{
    wresp.GetResponseStream().CopyTo(file); // CopyTo extension only .net 4.0+ 
}

否则你可以自己复制

using (Stream file = File.OpenWrite("path/to/output/file.pdf"))
{
    var input = wresp.GetResponseStream();

    var buffer = new byte[8 * 1024];

    int len;
    while ((len = input.Read(buffer, 0, buffer.Length)) > 0) 
    {
        file.Write(buffer, 0, len);
    }
}
于 2013-06-28T18:33:52.587 回答