Che differenza c'è tra le classi WebClient e HTTPWebRequest in .NET?


178

Che differenza c'è tra WebClientle HttpWebRequestclassi e in .NET? Entrambi fanno cose molto simili. In effetti, perché non sono stati uniti in una classe (troppi metodi / variabili, ecc. Potrebbero essere una ragione, ma ci sono altre classi in .NET che infrangono quella regola).

Grazie.

Risposte:


242

WebClient è un'astrazione di livello superiore costruita su HttpWebRequest per semplificare le attività più comuni. Ad esempio, se si desidera ottenere il contenuto da un HttpWebResponse, è necessario leggere dal flusso di risposta:

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Con WebClient, fai semplicemente DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Nota: ho lasciato fuori le usingdichiarazioni di entrambi gli esempi per brevità. Dovresti assolutamente fare attenzione a smaltire correttamente gli oggetti delle tue richieste web.

In generale, WebClient è utile per richieste semplici rapide e sporche e HttpWebRequest è utile quando è necessario un maggiore controllo sull'intera richiesta.


34
Quanto sopra è fatto, il seguente è opinione: entrambi sono terribili perché HttpWebRequest è rotto. Gestisce erroneamente l'autenticazione di base, richiede strane soluzioni come ServicePointManager.Expect100Continue = false, fa altre cose non standard e ha molte stranezze e idiosincrasie. Ho avviato RestSharp per aiutare a risolvere questi problemi.
John Sheehan,

4
Si noti inoltre che WebClient è un componente, quindi è possibile trascinarlo dalla finestra degli strumenti VS nel modulo e poterlo utilizzare lì.
Feroze

1
Penso di aver provato a utilizzare httpwebrequest con autenticazione di base qualche tempo fa. Posso essere d'accordo. Quindi hai fatto RestSharp? Freddo!
GurdeepS,

19
Chiunque si imbatta in questo come ho appena fatto, nota che c'è un nuovo giocatore sul campo chiamato HttpClientche viene fornito con .NET 4.5 che può (o no?) Risolvere alcuni dei problemi di cui sopra ...
Funka

3
WebClient implementa IDisposable, quindi dovresti considerare di farlousing (WebClient client = new WebClient())
Eric,

32

Inoltre WebClient non ha proprietà di timeout. E questo è il problema, perché il valore predefinito è 100 secondi e questo è troppo per indicare se non c'è una connessione Internet.

La soluzione alternativa a questo problema è qui https://stackoverflow.com/a/3052637/1303422


16
La domanda era qual è la differenza. Una delle differenze è che WebClient non ha proprietà di timeout mentre HttpWebRequest ha.
Andriy F.

26

So che è troppo tempo per rispondere, ma solo come scopo informativo per i futuri lettori:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Il WebRequestè una classe base astratta. Quindi in realtà non lo usi direttamente. Lo usi attraverso le sue classi derivate - HttpWebRequeste FileWebRequest.

Si utilizza il metodo Crea di WebRequestper creare un'istanza di WebRequest. GetResponseStreamritorna data stream.

Ci sono anche FileWebRequeste FtpWebRequestclassi che inheritprovengono da WebRequest. Normalmente, si usa WebRequest, beh, per fare una richiesta e convertire il reso in HttpWebRequest, FileWebRequesto FtpWebRequest, dipende dalla propria richiesta. Di seguito è riportato un esempio:

Esempio:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientfornisce operazioni comuni sendinge receivingdati da una risorsa identificata da a URI. Semplicemente, è un'astrazione di livello superiore di HttpWebRequest. Questo 'operazioni comuni' è ciò che differenzia WebClientda HttpWebRequest, come anche illustrato nell'esempio di seguito:

Esempio:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

Ci sono anche DownloadDatae DownloadFileoperazioni in WebClientistanza. Queste operazioni comuni semplificano anche il codice di ciò che normalmente faremmo HttpWebRequest. Utilizzando HttpWebRequest, dobbiamo ottenere la risposta della nostra richiesta, creare un'istanza StreamReaderper leggere la risposta e, infine, convertire il risultato in qualunque tipo ci aspettiamo. Con WebClient, semplicemente chiamiamoDownloadData, DownloadFile or DownloadString .

Tuttavia, tieni presente che WebClient.DownloadStringnon considera ilencoding la risorsa che stai richiedendo. Quindi, probabilmente finiresti per ricevere strani caratteri se non specifichi e codifichi.

NOTA: Fondamentalmente " WebClient accetta poche righe di codice rispetto a Webrequest "


La classe WebClient utilizza il metodo Post / Get ..? Fornisci un link per descrivere
Kartiikeya,

WebRequest ci consente di aggiungere il tipo di metodo di richiesta, ad esempio Get / Post con una proprietà METHOD. dove WebClient non ha alcun tipo di metodo per aggiungere funzionalità.
SHEKHAR SHETE,

1
@SHEKHARSHETE Sono stato in grado di utilizzare webClient.UploadData(url, "POST", bytes)per specificare il metodo (vedere i documenti MSDN ).
Jeff B,
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.