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.