设置webClient.DownloadFile()的超时


92

我正在webClient.DownloadFile()下载文件,我可以为此设置超时时间,以便它在无法访问文件时不会花费很长时间吗?

Answers:


42

尝试WebClient.DownloadFileAsync()。您可以CancelAsync()使用自己的超时计时器进行呼叫。


2
我不想使用计时器或秒表。我想要一些内置的hack或api方法。使用计时器/秒表使我花了更多的时间进行观看,尽管此功能可能已经实现,所以为什么要重新发明方向盘

@Kilanny:然后从另一个答案中选择解决方案。或使用HttpClient并设置Timeout属性。还请注意,此答案来自2009
。– abatishchev 2015年

8
在.Net 4.5+中,您还可以使用var taskDownload = client.DownloadFileTaskAsync(new Uri("http://localhost/folder"),"filename")然后taskDownload.Wait(TimeSpan.FromSeconds(5));
itsho 2016年

257

我的答案来自这里

您可以创建派生类,这将设置基WebRequest类的timeout属性:

using System;
using System.Net;

public class WebDownload : WebClient
{
    /// <summary>
    /// Time in milliseconds
    /// </summary>
    public int Timeout { get; set; }

    public WebDownload() : this(60000) { }

    public WebDownload(int timeout)
    {
        this.Timeout = timeout;
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = this.Timeout;
        }
        return request;
    }
}

您可以像基本的WebClient类一样使用它。


3
万一其他人遇到了这个有用的代码,我必须在调用base.GetWebRequest(address)之前设置超时时间
Darthtong 2012年

Resharper抱怨“结果”可能为空值,并建议在将Timeout值设置为WebRequest之前进行空检查。查看反编译的代码,除非您在web.config中提供自定义的WebRequestModules,否则似乎不可能,但是对于如此高的答案,我以防万一。
凯文·库洛姆贝

我在这一行遇到错误request.Timeout。错误消息'System.Net.WebRequest' does not contain a definition for 'Timeout' and no extension method 'Timeout' accepting a first argument of type 'System.Net.WebRequest' could be found (are you missing a using directive or an assembly reference?) ,我缺少什么?
埃里克

1
@Eric:我添加using了此代码段所使用的指令。
Beniamin

1
@titol:使用HttpClient而不是WebClient。
abatishchev 2015年

3

假设您想同步执行此操作,则使用WebClient.OpenRead(...)方法并在返回的Stream上设置超时将为您提供所需的结果:

using (var webClient = new WebClient())
using (var stream = webClient.OpenRead(streamingUri))
{
     if (stream != null)
     {
          stream.ReadTimeout = Timeout.Infinite;
          using (var reader = new StreamReader(stream, Encoding.UTF8, false))
          {
               string line;
               while ((line = reader.ReadLine()) != null)
               {
                    if (line != String.Empty)
                    {
                        Console.WriteLine("Count {0}", count++);
                    }
                    Console.WriteLine(line);
               }
          }
     }
}

从WebClient派生并重写GetWebRequest(...)以设置@Beniamin建议的超时,对我来说不起作用,但确实如此。


@jeffymorris对我不起作用。即使我指定的大小stream.ReadTimeout大于执行请求的实际花费,我仍然会收到WebException说的“请求已被中止-操作已超时”
chester89,2013年

@jeffymoris另一方面,使用webclient子类的解决方案也不起作用,因此在服务器端可能是一个问题
chester89,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.