Jaka jest różnica między klasami WebClient i HTTPWebRequest w .NET?

178

Jaka jest różnica między WebClienta HttpWebRequestklas w .NET? Obaj robią bardzo podobne rzeczy. W rzeczywistości, dlaczego nie zostały one połączone w jedną klasę (zbyt wiele metod / zmiennych itp. Może być jednym z powodów, ale istnieją inne klasy w .NET, które łamią tę zasadę).

Dzięki.

GurdeepS
źródło

Odpowiedzi:

242

WebClient to abstrakcja wyższego poziomu zbudowana na podstawie HttpWebRequest w celu uproszczenia najczęściej wykonywanych zadań. Na przykład, jeśli chcesz pobrać zawartość z HttpWebResponse, musisz przeczytać ze strumienia odpowiedzi:

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

Dzięki WebClient po prostu DownloadString:

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

Uwaga: usingdla zwięzłości pominąłem oświadczenia z obu przykładów. Zdecydowanie powinieneś zadbać o prawidłowe usunięcie obiektów żądań WWW.

Ogólnie rzecz biorąc, WebClient jest dobry dla szybkich i brudnych prostych żądań, a HttpWebRequest jest dobry, gdy potrzebujesz większej kontroli nad całym żądaniem.

John Sheehan
źródło
34
Powyższe jest faktem, oto opinia: oba są okropne, ponieważ HttpWebRequest jest zepsuty. Obsługuje podstawowe błędne uwierzytelnianie, wymaga dziwnych obejść, takich jak ServicePointManager.Expect100Continue = falserobienie innych niestandardowych rzeczy i ma wiele dziwactw i osobliwości. Uruchomiłem RestSharp, aby rozwiązać te problemy.
John Sheehan,
4
Pamiętaj również, że WebClient jest składnikiem, więc możesz przeciągnąć / upuścić go z okna narzędzi VS do formularza i móc go tam używać.
feroze
1
Myślę, że jakiś czas temu próbowałem użyć httpwebrequest z podstawową autoryzacją. Mogę się na to zgodzić. Więc stworzyłeś RestSharp? Chłodny!
GurdeepS
19
Każdy, kto spotka się z tym, tak jak ja właśnie teraz, pamiętaj, że na boisku jest nowy gracz o nazwie HttpClient.NET 4.5, który może (lub nie może?) Rozwiązać niektóre z powyższych problemów ...
Funka
3
WebClient implementuje IDisposable, więc powinieneś rozważyć zrobienie tegousing (WebClient client = new WebClient())
Eric
32

Również WebClient nie ma właściwości limitu czasu. I to jest problem, ponieważ domyślna wartość to 100 sekund, a to za dużo, aby wskazać, że nie ma połączenia z Internetem.

Obejście tego problemu jest tutaj: https://stackoverflow.com/a/3052637/1303422

Andriy F.
źródło
16
Pytanie brzmi, jaka jest różnica. Jedną z różnic jest to, że WebClient nie ma właściwości timeout, podczas gdy HttpWebRequest ma.
Andriy F.
26

Wiem, że to zbyt długo, aby odpowiedzieć, ale tylko jako cel informacyjny dla przyszłych czytelników:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

WebRequestJest abstrakcyjną klasą bazową. Więc właściwie nie używasz go bezpośrednio. Używasz go za pośrednictwem klas pochodnych - HttpWebRequesti FileWebRequest.

Używasz metody Create of, WebRequestaby utworzyć wystąpienie WebRequest. GetResponseStreamzwraca data stream.

Są też FileWebRequesti FtpWebRequestklasy inheritz tego WebRequest. Normalnie byłoby użyć WebRequestdo, dobrze, złożyć zamówienie i konwertować zwrotu albo HttpWebRequest, FileWebRequestlub FtpWebRequest, zależy od wniosku. Poniżej przykład:

Przykład:

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

WebClient

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

WebClientzapewnia wspólne operacje sendingi receivingdane z zasobu zidentyfikowanego przez a URI. Po prostu jest to abstrakcja wyższego poziomu HttpWebRequest. Ten „wspólnych operacji” jest co odróżnienia WebClientod HttpWebRequest, jak również pokazano w poniższym przykładzie:

Przykład:

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

Istnieją również DownloadDatai DownloadFileoperacje w ramach WebClientinstancji. Te wspólne operacje upraszczają również kod tego, co normalnie robilibyśmy HttpWebRequest. Używając HttpWebRequest, musimy uzyskać odpowiedź na nasze żądanie, zainicjować StreamReaderodczytanie odpowiedzi i ostatecznie przekonwertować wynik na dowolny typ, jakiego oczekujemy. Po WebClientprostu dzwonimy DownloadData, DownloadFile or DownloadString.

Pamiętaj jednak, że WebClient.DownloadStringnie uwzględnia encodingto żądanego zasobu. Więc prawdopodobnie otrzymasz dziwne znaki, jeśli nie określisz i nie zakodujesz.

UWAGA: Zasadniczo „ WebClient zajmuje kilka wierszy kodu w porównaniu z Webrequest

SHEKHAR SHETE
źródło
Czy klasa WebClient używa metody Post / Get ..? Podaj link do opisu
Kartiikeya
WebRequest pozwala nam dodać typ metody żądania, tj. Get / Post z właściwością METHOD. gdzie jako WebClient nie mają funkcji dodawania typu metody.
SHEKHAR SHETE
1
@SHEKHARSHETE Mogłem użyć webClient.UploadData(url, "POST", bytes)do określenia metody (zobacz dokumentację MSDN ).
Jeff B