Comment modifier le délai d’attente sur un object .NET WebClient

J’essaie de télécharger les données d’un client sur mon ordinateur local (par programme) et leur serveur Web est très, très lent, ce qui provoque un délai d’attente dans mon object WebClient .

Voici mon code:

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

Y a-t-il un moyen de définir un délai d’expiration infini sur cet object? Ou sinon, quelqu’un peut-il m’aider avec un exemple d’une autre façon de le faire?

L’URL fonctionne correctement dans un navigateur – cela prend juste environ 3 minutes pour montrer.

Vous pouvez étendre le délai d’expiration: héritez de la classe WebClient d’origine et remplacez l’object getbrequin pour définir votre propre délai, comme dans l’exemple suivant. MyWebClient était une classe privée dans mon cas

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

Vous devez utiliser HttpWebRequest plutôt que WebClient car vous ne pouvez pas définir le délai d’attente sur WebClient sans l’étendre (même s’il utilise HttpWebRequest ). L’utilisation du HttpWebRequest vous permettra plutôt de définir le délai d’attente.

La première solution n’a pas fonctionné pour moi mais voici un code qui a fonctionné pour moi.

  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 ssortingng GetRequest(ssortingng aURL) { using (var lWebClient = new WebClient()) { lWebClient.Timeout = 600 * 60 * 1000; return lWebClient.DownloadSsortingng(aURL); } } 

Impossible de faire fonctionner le code w.Timeout lorsqu’il a sorti le câble réseau, il n’était tout simplement pas arrivé à expiration, déplacé à l’aide de HttpWebRequest et fait le travail maintenant.

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

Comme Sohnee le dit, utiliser System.Net.HttpWebRequest et définir la propriété Timeout au lieu d’utiliser System.Net.WebClient .

Vous ne pouvez toutefois pas définir une valeur de délai d’expiration infinie (elle n’est pas prise en charge et tenter de le faire entraînera une ArgumentOutOfRangeException ).

Je recommande d’abord d’effectuer une requête HTTP HEAD et d’examiner la valeur d’en Content-Length tête Content-Length renvoyée pour déterminer le nombre d’octets du fichier que vous téléchargez, puis de définir la valeur du délai d’attente pour une demande GET ultérieure ou simplement un délai d’attente très long. valeur que vous ne prévoyez jamais dépasser.

 '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 

Pour être complet, voici la solution de Kisp scope sur VB (impossible d’append du code à un commentaire)

 Namespace Utils '''  ''' Subclass of WebClient to provide access to the timeout property '''  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 '''  ''' Set the web call timeout in Milliseconds '''  '''  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