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?

Author: Eonasdan, 2009-05-22

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.

 131
Author: David Wengier,
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

 29
Author: Orhan Cinar,
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.

 10
Author: Kevin,
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