C # HttpWebRequest vs WebRequest
Widziałem ten fragment kodu:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
Dlaczego musisz rzucać (HttpWebRequest)
? Dlaczego po prostu nie użyć HttpWebRequest.Create
? I dlaczego HttpWebRequest.Create
tworzy WebRequest
, a nie HttpWebRequest
?
3 answers
Metoda Create
jest statyczna i istnieje tylko na WebRequest
. Wywołanie go jako HttpWebRequest.Create
może wyglądać inaczej, ale w rzeczywistości jest skompilowane do wywołania WebRequest.Create
. Wydaje się, że jest na HttpWebRequest
z powodu dziedziczenia.
Metoda Create
wewnętrznie wykorzystuje wzorzec fabryczny do rzeczywistego tworzenia obiektów, w oparciu o Uri
, które do niego przekazujesz. Możesz odzyskać inne obiekty, takie jak FtpWebRequest
lub FileWebRequest
, w zależności od Uri
.
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
2014-01-08 19:37:02
WebRequest
jest klasą abstrakcyjną, która posiada metodę fabryczną Create
, która w zależności od przekazanego adresu URL tworzy instancję konkretnej podklasy. Czy potrzebujesz czy chcesz
HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);
zamiast
WebRequest req = WebRequest.Create(strUrl);
zależy od twoich potrzeb i od tego, jakie adresy URL przekazujesz.
Jeśli przekazujesz tylko adresy URL HTTP:, wtedy poprzedni kod umożliwia dostęp do właściwości i metod implementowanych przez podklasę HttpWebRequest
oprócz tych zdefiniowanych w klasie bazowej WebRequest
. Ale jeśli przekazałeś w FTP: URL to próba oddania do HttpWebRequest
nie powiodła się.
Ta ostatnia jest generyczna i nie zawiedzie żadnego z typów obsługiwanych adresów URL, ale oczywiście bez odlewania do żadnej podklasy możesz uzyskać dostęp tylko do właściwości i metod zdefiniowanych przez klasę bazową.
-- via Martin Honnen
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
2012-11-21 11:34:02
Obsada jest niezbędna tylko wtedy, gdy potrzebujesz dostępu do członków unikalnych dla HttpWebRequest. Chodzi o to, że jeśli właściwości / metody obsługiwane na WebRequest są wystarczające, możesz napisać aplikację, która będzie działać na wielu typach protokołów żądania / odpowiedzi. W tym przypadku URI może być czymś nadanym przez Użytkownika przy użyciu dowolnego protokołu obsługiwanego przez protokoły wtykowe. Nowe protokoły mogą być nawet obsługiwane bez zmiany oryginalnego oprogramowania.
Jeśli twój wniosek wymaga większej kontroli nad funkcjami specyficznymi dla konkretnego protokołu, a następnie można ograniczyć requestUri do obsługiwanych schematów i cast WebRequest do odpowiedniej podklasy specyficznej dla protokołu. Ogranicza to protokoły obsługiwane przez aplikację, ale umożliwia dostosowanie funkcji specyficznych dla protokołu.
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
2012-06-15 16:56:20