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?

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


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.


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.


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.


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.


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

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.