我正在使用C#.Net
在Visual Studio 2010中编写程序程序是将文件从给定的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
保存文件?我该怎么做呢?
答案 0 :(得分:11)
您可以创建自己的WebClient
public class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
var req = base.GetWebRequest(address);
req.Timeout = 15000;
return req;
}
}
答案 1 :(得分:4)
如果您使用的是.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
答案 2 :(得分:1)
使用WebClient
无法直接更改超时。但您可以使用WebClient.DownloadFileAsync()
代替。这样您就可以在需要时使用CancelAsync()
。
答案 3 :(得分: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);
}
}