正在从url下载文件,超时

本文关键字:文件 超时 下载 url | 更新日期: 2023-09-27 18:20:23

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

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

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

目前,我正在使用WebClient

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

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

有时,url就是不响应,所以我让我的程序在终止之前尝试下载5次。然后我意识到WebClient的默认超时时间太长了(比如2分钟左右)。有没有一种简单的方法可以将超时时间设置得更短,比如15秒?

我还研究了HttpWebRequest,它可以很容易地设置超时HttpWebRequest.Timeout = 15000;。然而,使用这种方法,我不知道如何下载/保存文件。

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

正在从url下载文件,超时

您可以创建自己的WebClient

public class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        var req = base.GetWebRequest(address);
        req.Timeout = 15000;
        return req;
    }
}

如果使用.NET 4.5:,则可以使用HttpClient

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

使用WebClient无法直接更改超时。但是您可以使用WebClient.DownloadFileAsync()。这将允许您在需要时使用CancelAsync()

在.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);
    }
}