System.Net.WebClient irragionevolmente lento

Quando utilizzo il metodo System.Net.WebClient.DownloadData () sto ottenendo un tempo di risposta irragionevolmente lento.

Quando si preleva un url usando la class WebClient in .NET ci vogliono circa 10 secondi prima di ottenere una risposta, mentre la stessa pagina viene recuperata dal mio browser in meno di 1 secondo. E questo è con dati che hanno 0.5kB o dimensioni più piccole.

La richiesta coinvolge i parametri POST / GET e un’intestazione dell’agente utente se ciò potrebbe causare problemi.

Non ho (ancora) provato se altri modi per scaricare dati in .NET mi danno gli stessi problemi, ma sospetto che potrei ottenere risultati simili. (Ho sempre avuto la sensazione che le richieste web in .NET siano insolitamente lente …)

Quale potrebbe essere la causa di questo?

Modificare:
Ho provato a fare la cosa esatta usando System.Net.HttpWebRequest invece, usando il metodo seguente, e tutte le richieste finiscono in meno di 1 secondo.

 public static string DownloadText(string url) var request = (HttpWebRequest)WebRequest.Create(url); var response = (HttpWebResponse)request.GetResponse(); using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } 

Mentre questo (vecchio) metodo che usa System.Net.WebClient richiede 15-30 per ogni richiesta da finire:

 public static string DownloadText(string url) { var client = new WebClient(); byte[] data = client.DownloadData(url); return client.Encoding.GetString(data); } 

Ho avuto questo problema con WebRequest. Prova a impostare Proxy = null;

  WebClient wc = new WebClient(); wc.Proxy = null; 

Per impostazione predefinita, WebClient, WebRequest tenta di determinare quale proxy utilizzare dalle impostazioni di IE, a volte risulta in un ritardo di 5 secondi prima che venga inviata la richiesta effettiva.

Questo vale per tutte le classi che utilizzano WebRequest, inclusi i servizi WCF con binding HTTP. In generale è ansible utilizzare questo codice statico all’avvio dell’applicazione:

 WebRequest.DefaultWebProxy = null; 

Scarica Wireshark qui http://www.wireshark.org/

Cattura i pacchetti di rete e filtra i pacchetti “http”. Dovrebbe darti la risposta subito.

Non c’è nulla di intrinsecamente lento nelle richieste Web .NET; quel codice dovrebbe andare bene. Uso regolarmente WebClient e funziona molto velocemente.

Quanto è grande il carico utile in ciascuna direzione? Domanda sciocca forse, ma sono semplicemente dei limiti di larghezza di banda?

IMO la cosa più probabile è che il tuo sito Web sia passato al livello più basso e quando si colpisce l’URL il sito Web è lento a rispondere. Questo non è quindi colpa del cliente. È anche ansible che DNS sia lento per qualche motivo (nel qual caso è ansible codificare l’IP nel file “host”) o che alcuni server proxy nel mezzo sono lenti.

Se il sito web non è il tuo, è anche ansible che stiano rilevando un utilizzo atipico e intenzionalmente iniettando un ritardo per infastidire gli scraper.

Prenderò Fiddler (un semplice web inspector gratuito) e guarderò i tempi.

Un’altra alternativa (anche gratuita) a Wireshark è Microsoft Network Monitor .

Quale browser stai usando per testare?

Prova a utilizzare l’installazione IE predefinita. System.Net.WebClient utilizza le impostazioni IE locali, il proxy ecc. Forse è stato storpiato?

WebClient potrebbe essere lento su alcune workstation quando Impostazioni proxy automatico sono selezionate nelle impostazioni di IE (scheda Connessioni – Impostazioni LAN).

Un’altra causa dei download estremamente lenti di WebClient è il supporto di destinazione a cui si sta scaricando. Se si tratta di un dispositivo lento come una chiave USB, questo può avere un impatto enorme sulla velocità di download. Sul mio HDD ho potuto scaricare a 6MB / s, sulla mia chiavetta USB, solo 700kb / s, anche se posso copiare i file su questa USB a 5MB / s da un’altra unità. wget mostra lo stesso comportamento. Questo è anche riportato qui:

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

Quindi, se questo è il tuo scenario, una soluzione alternativa è scaricare prima su HDD e poi copiare i file sul supporto lento al termine del download.