如何更改.NET WebClient对象的超时值

我试图下载客户端的数据到我的本地机器(编程),他们的networking服务器是非常,非常慢,这是导致我的WebClient对象超时。

这是我的代码:

 WebClient webClient = new WebClient(); webClient.Encoding = Encoding.UTF8; webClient.DownloadFile(downloadUrl, downloadFile); 

有没有办法在这个对象上设置无限超时? 或者,如果没有任何人可以帮助我在一个替代的方式来做这个例子吗?

该url在浏览器中正常工作 – 只需要大约3分钟即可显示。

您可以延长超时时间:inheritance原始的WebClient类并覆盖webrequest getter来设置您自己的超时时间,如下例所示。 在我的情况下MyWebClient是一个私人类

  private class MyWebClient : WebClient { protected override WebRequest GetWebRequest(Uri uri) { WebRequest w = base.GetWebRequest(uri); w.Timeout = 20 * 60 * 1000; return w; } } 

您需要使用HttpWebRequest而不是WebClient因为您无法在不扩展WebClient情况下设置超时(即使使用HttpWebRequest )。 改为使用HttpWebRequest将允许您设置超时。

正如Sohnee所说,使用System.Net.HttpWebRequest并设置Timeout属性而不是使用System.Net.WebClient

你不能设置无限的超时值(不支持,试图这样做会抛出一个ArgumentOutOfRangeException )。

我build议首先执行一个HEAD HTTP请求,然后检查返回的Content-Length头部值,以确定正在下载的文件中的字节数,然后相应地为随后的GET请求设置超时值,或者简单地指定一个非常长的超时价值,你永远不会期望超过。

 'CORRECTED VERSION OF LAST FUNCTION IN VISUAL BASIC BY GLENNG Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest Dim w As System.Net.WebRequest = MyBase.GetWebRequest(address) If _TimeoutMS <> 0 Then w.Timeout = _TimeoutMS End If Return w '<<< NOTICE: MyBase.GetWebRequest(address) DOES NOT WORK >>> End Function 

为了完整性,这里是kisp的解决scheme移植到VB(不能添加代码评论)

 Namespace Utils ''' <summary> ''' Subclass of WebClient to provide access to the timeout property ''' </summary> Public Class WebClient Inherits System.Net.WebClient Private _TimeoutMS As Integer = 0 Public Sub New() MyBase.New() End Sub Public Sub New(ByVal TimeoutMS As Integer) MyBase.New() _TimeoutMS = TimeoutMS End Sub ''' <summary> ''' Set the web call timeout in Milliseconds ''' </summary> ''' <value></value> Public WriteOnly Property setTimeout() As Integer Set(ByVal value As Integer) _TimeoutMS = value End Set End Property Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest Dim w As System.Net.WebRequest = MyBase.GetWebRequest(address) If _TimeoutMS <> 0 Then w.Timeout = _TimeoutMS End If Return w End Function End Class End Namespace 

当拔出网线时无法使w.Timeout代码工作,只是没有超时,转移到使用HttpWebRequest并现在做的工作。

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadUrl); request.Timeout = 10000; request.ReadWriteTimeout = 10000; var wresp = (HttpWebResponse)request.GetResponse(); using (Stream file = File.OpenWrite(downloadFile)) { wresp.GetResponseStream().CopyTo(file); } 

第一个解决scheme不适合我,但是这里有一些代码对我有用。

  private class WebClient : System.Net.WebClient { public int Timeout { get; set; } protected override WebRequest GetWebRequest(Uri uri) { WebRequest lWebRequest = base.GetWebRequest(uri); lWebRequest.Timeout = Timeout; ((HttpWebRequest)lWebRequest).ReadWriteTimeout = Timeout; return lWebRequest; } } private string GetRequest(string aURL) { using (var lWebClient = new WebClient()) { lWebClient.Timeout = 600 * 60 * 1000; return lWebClient.DownloadString(aURL); } }