Jaka jest różnica między klasami WebClient i HTTPWebRequest in.NET?
Jaka jest różnica między klasami WebClient
i HttpWebRequest
W. NET? obie 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 są inne klasy w. Net, które łamią tę regułę).
3 answers
WebClient jest abstrakcją wyższego poziomu zbudowaną na bazie HttpWebRequest w celu uproszczenia najczęstszych zadań. Na przykład, jeśli chcesz uzyskać 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();
Z WebClient po prostu robisz DownloadString
:
var client = new WebClient();
var content = client.DownloadString("http://example.com");
Uwaga: pominąłem using
stwierdzenia z obu przykładów dla zwięzłości. Zdecydowanie powinieneś zadbać o właściwe usuwanie obiektów web request.
Ogólnie Rzecz Biorąc, WebClient jest dobry dla szybkich i brudnych prostych żądań i HttpWebRequest jest dobry, gdy potrzebujesz większej kontroli nad całym żądaniem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-14 02:32:12
Również WebClient nie posiada właściwości timeout. I w tym problem, ponieważ wartość dafault wynosi 100 sekund i to za dużo, aby wskazać, czy nie ma połączenia z Internetem.
Obejście tego problemu jest tutaj https://stackoverflow.com/a/3052637/1303422
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30
Wiem, że to zbyt długo, aby odpowiedzieć, ale po prostu jako cel informacyjny dla przyszłych czytelników:
WebRequest
System.Object
System.MarshalByRefObject
System.Net.WebRequest
WebRequest
jest abstrakcyjną klasą bazową. Więc nie używasz go bezpośrednio. Używa się go poprzez klasy pochodne - HttpWebRequest
i FileWebRequest
.
Używasz metody Create of WebRequest
Aby utworzyć instancję WebRequest
. GetResponseStream
zwraca data stream
.
Istnieją również klasy FileWebRequest
i FtpWebRequest
, które inherit
pochodzą z WebRequest
. Normalnie, można użyć WebRequest
, Aby, złóż wniosek i przekonwertuj zwrot NA albo HttpWebRequest
, FileWebRequest
lub FtpWebRequest
, zależy od twojej prośby. 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
WebClient
zapewnia wspólne operacje na sending
i receiving
danych z zasobu identyfikowanego przez URI
. Po prostu jest to abstrakcja wyższego poziomu HttpWebRequest
. Te "wspólne operacje" są tym, co odróżnia WebClient
od HttpWebRequest
, jak również pokazano w próbce poniżej:
Przykład:
var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");
Istnieją również operacje DownloadData
i DownloadFile
pod instancją WebClient
. Te wspólne operacje również upraszczają Kod tego, co normalnie zrobilibyśmy z HttpWebRequest
. Używając HttpWebRequest
, musimy uzyskać odpowiedź naszego żądania, utworzyć instancję StreamReader
, aby odczytać odpowiedź i ostatecznie przekonwertować wynik na dowolny typ, jakiego oczekujemy. Z WebClient
, po prostu nazywamy DownloadData, DownloadFile or DownloadString
.
Należy jednak pamiętać, że WebClient.DownloadString
nie bierze pod uwagę encoding
Z źródło, o które prosisz. Tak więc prawdopodobnie otrzymałbyś dziwne znaki, jeśli nie podasz i nie kodujesz.
Uwaga: zasadniczo " WebClient pobiera kilka linii kodu w porównaniu do Webrequest"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-29 08:52:32