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łę).

Dzięki.
Author: abatishchev, 2011-02-14

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.

 219
Author: John Sheehan,
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

 25
Author: Andriy F.,
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"

 24
Author: SHEKHAR SHETE,
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