WebClient a HttpWebRequest / HttpWebResponse

132

Wydaje mi się, że większość tego, co można osiągnąć, HttpWebRequest/Responsemożna również osiągnąć z WebClientklasą. Czytałem gdzieś, że WebClientjest to opakowanie wysokiego poziomu WebRequest/Response.
Jak dotąd nie widzę niczego, co można by osiągnąć HttpWebRequest/Response, czego nie można by osiągnąć WebClient, ani gdzie HttpWebRequest / Response da ci większą „drobnoziarnistą” kontrolę.

Kiedy powinienem używać WebClient i kiedy HttpWebRequest/Response? (Oczywiście HttpWebRequest/Responsesą specyficzne dla HTTP).

Jeśli HttpWebRequest/Responsejesteś na niższym poziomie WebClient, co mogę osiągnąć HttpWebRequest/Response, czego nie mogę osiągnąć WebClient?

Dan
źródło

Odpowiedzi:

87

Używanie HttpWebRequestzapewnia większą kontrolę nad żądaniem. Możesz ustawić pliki cookie, nagłówki, protokół itp. W odpowiedzi możesz również pobrać pliki cookie i nagłówki

Thomas Levesque
źródło
14
Thomas, nadal nie jestem przekonany ... WebClient ma właściwość Headers, możesz pobrać plik cookie w następujący sposób: String cookie = webClient.ResponseHeaders („Set-Cookie”) i ustawić go: webClient.Headers.Add („Cookie”, „ CommunityServer-UserCookie… ”);
Dan
14
Za pomocą HttpWebRequest możesz zdefiniować limit czasu. W WebClient to niemożliwe.
ripper234
14
@ ripper234, właściwie jest to możliwe: wystarczy odziedziczyć WebClient i zastąpić GetWebRequest, aby dostosować HttpWebRequest
Thomas Levesque
16
@ThomasLevesque, jeśli dziedziczysz klienta internetowego i nadpisujesz zapytanie internetowe, korzystanie z klienta internetowego wydaje się bezcelowe ...
Hagai L,
5
@HagaiL, nie zgadzam się ... Nie musisz ręcznie tworzyć całego wniosku, możesz go użyć, base.GetWebRequestaby go utworzyć, a następnie dostosować to, co chcesz
Thomas Levesque,
55

HttpWebRequest ujawnia o wiele więcej rzeczy, które pozwalają na precyzyjną kontrolę protokołu, na przykład: czy chcesz używać Keep-Alive, jakiej puli połączeń użyć, czy buforować zapisy, czy nie itp.

WebClientnie ujawnia wszystkich z nich (chociaż można utworzyć podklasę zi WebClientuzyskać dostęp do bazowego obiektu Request).

WebClientJest to przydatne dla tych sytuacjach, w których po prostu chcą zrobić operację (np: POST / GET / Forma upload) i cant być jedno, aby tworzyć i zarządzać HttpWebRequest, RequestStream, HttpWebResponseoraz strumień odpowiedzi.

feroze
źródło
13
Jest jeszcze jedna rzecz, o której zapomniałem wspomnieć. WebClient jest obiektem Component, podczas gdy HttpWebRequest nie jest. Co to znaczy? Cóż, jeśli używasz VisualStudio do tworzenia aplikacji GUI, możesz przeciągnąć / upuścić komponent WebClient na formularzu i użyć go do wysyłania żądań do serwerów HTTP / FTP itp.
feroze
14

Z bloga Tima Heuera - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Zamiast tego w Silverlight będziesz chciał użyć WebClient lub HttpWebRequest. Co za różnica? Oto wersja timheuera. WebClient to prostsza implementacja, która bardzo łatwo wykonuje żądania GET i otrzymuje strumień odpowiedzi. HttpWebRequest jest świetny, gdy potrzebujesz nieco bardziej szczegółowej kontroli nad żądaniem, musisz wysłać nagłówki lub inne dostosowania.

Benjamin Cox
źródło
7
WebClient umożliwia również POST, z UploadString, UploadData i UploadFile
Thomas Levesque
@ThomasLevesque Czy jest dziś nowsza wersja zajęć? Widzę, że ta dyskusja jest trochę, hmm ...
stara
@KonradViltersten, nie sądzę, aby zaszły duże zmiany w klasie WebClient. W przypadku nowych aplikacji sugeruję zamiast tego użycie HttpClient, który jest również bardzo łatwy w użyciu i znacznie bardziej elastyczny.
Thomas Levesque
1
@ThomasLevesque Dobrze, to był ten, o którym myślałem. Przypomniałem sobie http jako różnicę w nazwie klasy i zostałem wprowadzony w błąd przez część Http ... Teraz jestem z powrotem na dobrej drodze. Dzięki!
Konrad Viltersten
13

W WebClient klasa działa na wątku interfejsu użytkownika, dzięki czemu interfejs użytkownika nie reaguje, gdy dane są pobierane z Internetu. Z drugiej strony klasa HttpWebRequest nie blokuje wątku interfejsu użytkownika, a aplikacja jest responsywna. Tak więc w aplikacjach, w których ma być pobierana duża ilość danych z Internetu lub jeśli źródło danych jest wolno dostępne, należy użyć klasy HttpWebRequest; we wszystkich innych przypadkach należy używać klasy WebClient.

Baaziz
źródło
1
W przypadku WP7 jest odwrotnie. HttpWebRequest kieruje z powrotem do wątku UI w Mango, powodując teraz niekończący się smutek. Grrr
Cameron MacFarland
6
WebClient obsługuje również metody asynchroniczne.
CyberMonk
6

Inną wadą programu WebClientjest to, że ignoruje on wartość HTTP ContentType, charsetgdy używasz go do uzyskania tekstu odpowiedzi. Musisz jawnie ustawić kodowanie za pośrednictwem Encodingwłaściwości.

Sam
źródło
To dobra uwaga; i nie jest to tylko kwestia ustawienia Encoding- nie możesz znać kodowania, dopóki nie pojawi się żądanie, więc interfejs API WebClient sprawia, że ​​jest bardzo mało prawdopodobne, że będziesz w stanie poprawnie pobrać ciąg w nieznanym kodowaniu.
Eamon Nerbonne
5

Jeszcze jedno, HttpWebrquest pozwala na kompresję, ale klasa Net.WebClient nie obsługuje kompresji HTTP

Zain Ali
źródło
3
Podobnie jak w przypadku wszystkich innych przykładów WebClient ukrywających niektóre szczegóły, można to naprawić, podklasując WebClient i nadpisując GetWebRequest. W takim przypadku po prostu dostosowujesz podstawową HttpWebRequest.AutomaticDecompressiongwłaściwość ).
patridge
5

„HtttpWebRequest” jest przestarzały w .NET 4.5. Teraz ta klasa jest tylko wewnętrzna.

Julio Spader
źródło
2
W rzeczy samej. Użyj WebRequestzamiast tego.
Silkfire
2
Klasa nie jest przestarzała, ale konstruktory. A klasa nie jest wewnętrzna, nadal jest publiczna.
user247702
2

Jeden przykład: wysyłanie danych i odzyskiwanie przetworzonych danych w jednym cyklu żądanie / odpowiedź wydaje się niemożliwe w przypadku WebClient, ale możesz to zrobić za pomocą HtttpWebRequest.

synergiczny
źródło
2
Po prostu użyj WebClient.UploadString lub WebClient.UploadData, aby wykonać POST i uzyskać ciąg odpowiedzi lub tablicę bajtów.
samjudson
2
Aby wyjaśnić, wartość zwracana przez UploadString to ciąg, a wartość zwracana przez metodę UploadData to tablica bajtów.
Norman H