7 ответов:
вы можете продлить тайм-аут: наследовать исходный класс WebClient и переопределить геттер webrequest, чтобы установить свой собственный тайм-аут, как в следующем примере. 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вместо позволит вам установить тайм-аут.
первое решение не работает для меня, но вот некоторый код, который работал для меня.
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); } }
не удалось получить код 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); }
как Sohnee говорит, используя
System.Net.HttpWebRequestи выберитеTimeoutсобственность вместо того, чтобы использоватьSystem.Net.WebClient.однако вы не можете установить бесконечное значение тайм-аута (оно не поддерживается, и попытка сделать это вызовет
ArgumentOutOfRangeException).Я бы рекомендовал сначала выполнять 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 портировано на 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
Comments