WebClient vs. HttpWebRequest / HttpWebResponse


132

Mi sembra che la maggior parte di ciò che può essere realizzato HttpWebRequest/Responsepossa essere realizzato anche con la WebClientclasse. Ho letto da qualche parte che WebClientè un wrapper di alto livello per WebRequest/Response.
Finora, non riesco a vedere nulla che possa essere realizzato con HttpWebRequest/Responsecui non possa essere realizzato WebClient, né dove HttpWebRequest / Response ti darà un controllo più preciso.

Quando dovrei usare WebClient e quando HttpWebRequest/Response? (Ovviamente, HttpWebRequest/Responsesono specifici di HTTP.)

Se HttpWebRequest/Responsesono di livello inferiore WebClient, cosa posso fare con HttpWebRequest/Responseciò che non posso realizzare WebClient?

Risposte:


87

L'utilizzo HttpWebRequestoffre un maggiore controllo sulla richiesta. È possibile impostare cookie, intestazioni, protocollo, ecc ... Nella risposta, è anche possibile recuperare i cookie e le intestazioni


14
Thomas, ancora non convinto ... WebClient ha una proprietà Headers, puoi recuperare il cookie in questo modo: String cookie = webClient.ResponseHeaders ("Set-Cookie") e impostarlo: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie ... ");
Dan

14
Utilizzando HttpWebRequest è possibile definire un timeout. In WebClient, è impossibile.
ripper234,

14
@ ripper234, in realtà è possibile: devi solo ereditare WebClient e sovrascrivere GetWebRequest per personalizzare HttpWebRequest
Thomas Levesque

15
@ThomasLevesque se stai ereditando il client web e sovrascrivendo la richiesta web, sembra inutile usare il client web ...
Hagai L

5
@HagaiL, non sono d'accordo ... Non è necessario creare manualmente l'intera richiesta, è possibile utilizzarla base.GetWebRequestper crearla e quindi personalizzare esattamente ciò che si desidera
Thomas Levesque,

54

HttpWebRequest espone molte più cose che ti consentono un controllo del protocollo ben preciso, ad esempio: se vuoi usare Keep-Alive, quale pool di connessioni usare, se bufferizzare le scritture o meno, ecc.

WebClientnon espone tutti (anche se è possibile eseguire la sottoclasse WebCliente accedere all'oggetto Request sottostante).

WebClientè utile per quelle situazioni in cui si desidera solo fare un'operazione (ad esempio: POST / GET / upload Form) e non si ha voglia di creare e gestire il HttpWebRequest, RequestStream, HttpWebResponse, e flusso di risposta.


13
Inoltre, c'è un'altra cosa che ho dimenticato di menzionare. WebClient è un oggetto Component, mentre HttpWebRequest non lo è. Cosa significa? Bene, se si utilizza VisualStudio per creare un'app GUI, è possibile trascinare / rilasciare il componente WebClient sul modulo e utilizzarlo per inviare richieste a server HTTP / FTP ecc.
Feroze,

14

Dal blog di Tim Heuer - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Invece in Silverlight ti consigliamo di utilizzare WebClient o HttpWebRequest. Qual è la differenza? Ecco la versione timheuer. WebClient è un'implementazione più semplice che fa richieste GET in modo molto semplice e ottiene un flusso di risposta. HttpWebRequest è ideale per quando è necessario un controllo un po 'più granulare sulla richiesta, è necessario inviare intestazioni o altre personalizzazioni.


7
WebClient consente anche il POST, con UploadString, UploadData e UploadFile
Thomas Levesque,

@ThomasLevesque Esiste oggi una versione più recente delle lezioni? Vedo che questa discussione è un po ', hmm ... invecchiata ...
Konrad Viltersten

@KonradViltersten, non credo ci siano stati molti cambiamenti nella classe WebClient. Per le nuove app ti suggerisco di utilizzare HttpClient, che è anche molto facile da usare e molto più flessibile.
Thomas Levesque,

1
@ThomasLevesque destro, che era quello che stavo pensando. Ho ricordato http come la differenza nel nome della classe e sono stato fuorviato da Http ... parte. Ora sono tornato sulla strada giusta. Grazie!
Konrad Viltersten,

12

La classe WebClient viene eseguita sul thread dell'interfaccia utente, pertanto l'interfaccia utente non risponde mentre i dati vengono scaricati da Internet. D'altra parte, la classe HttpWebRequest non blocca il thread dell'interfaccia utente e l'applicazione è reattiva. Pertanto, nelle app in cui è necessario scaricare una grande quantità di dati da Internet o se l'accesso alla fonte dei dati è lento, è necessario utilizzare la classe HttpWebRequest; in tutti gli altri casi, è necessario utilizzare la classe WebClient.


1
È vero il contrario su WP7. HttpWebRequest esegue il marshalling al thread dell'interfaccia utente in Mango, causando in questo momento la fine del dolore. Grrr
Cameron MacFarland,

6
WebClient supporta anche metodi asincroni.
CyberMonk,

6

Un altro svantaggio di WebClientè ignora l'HTTP ContentTypes' charsetvalore quando lo si utilizza per ottenere il testo di risposta. Devi impostare esplicitamente la codifica tramite la Encodingproprietà.


Questo è un buon punto; e non è solo una questione di impostazione di Encoding- non puoi conoscere la codifica fino a dopo la richiesta, quindi l'API WebClient rende molto improbabile che sarai in grado di scaricare correttamente una stringa in una codifica sconosciuta.
Eamon Nerbonne,


5

"HtttpWebRequest" è obsoleto in .NET 4.5. Ora, questa classe è solo interna.


2
Infatti. Usa WebRequestinvece.
Silkfire

2
La classe non è obsoleta, lo sono i costruttori. E la classe non è interna, è ancora pubblica.
user247702

2

Un esempio: la pubblicazione di dati e il recupero dei dati elaborati in un ciclo di richiesta / risposta sembra impossibile con WebClient, ma è possibile farlo con HtttpWebRequest.


2
Utilizzare semplicemente WebClient.UploadString o WebClient.UploadData per eseguire un POST e recuperare una stringa di risposta o un array di byte.
Samjudson,

2
Per chiarire, il valore restituito di UploadString è una stringa e il valore restituito del metodo UploadData è una matrice di byte.
Norman H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.