C# HttpWebRequest vs WebRequest
Я видел этот кусок кода:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
зачем вам нужно бросать (HttpWebRequest)? Почему бы просто не использовать HttpWebRequest.Create? И почему же HttpWebRequest.Create сделать WebRequest, а не HttpWebRequest?
3 ответов:
The
Createметод статичен и существует только наWebRequest. Называя его какHttpWebRequest.Createможет выглядеть по-другому, но на самом деле он скомпилирован до вызоваWebRequest.Create. Это только кажется, что наHttpWebRequestиз-за наследства.The
Createметод внутренне, использует шаблон фабрики для создания объектов, на основанииUriвы переходите к нему. Вы могли бы на самом деле получить обратно другие объекты, какFtpWebRequestилиFileWebRequestв зависимости отUri.
WebRequest- это абстрактный класс, который имеет метод фабрикиCreateэто, в зависимости от переданного URL, создает экземпляр конкретного подкласса. Если вам нужно или хотитеHttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);вместоWebRequest req = WebRequest.Create(strUrl);зависит от ваших потребностей и от того, какие URL-адреса вы передаете.если вы только передаете в HTTP: URL, то прежний код позволяет получить доступ к свойствам и методам подкласса
HttpWebRequestреализует в дополнение к тем, которые определены в базовом классеWebRequest. Но если вы передано в FTP: URL, затем попытка привести кHttpWebRequestпотерпит неудачу.последний является универсальным и не будет терпеть неудачу ни на одном из типов поддерживаемых URL-адресов, но, конечно, без приведения к какому-либо подклассу вы можете получить доступ только к свойствам и методам, которые определяет базовый класс.
-- via Martin Honnen
приведение необходимо только тогда, когда вам нужен доступ к членам, уникальным для HttpWebRequest. Идея заключается в том, что если свойства/методы, поддерживаемые в WebRequest, достаточны, то вы можете написать приложение, которое будет работать со многими типами протоколов запроса/ответа. В этом случае URI может быть чем-то заданным пользователем с использованием любого протокола, поддерживаемого подключаемыми протоколами. Новые протоколы могут даже поддерживаться без изменения исходного программного обеспечения.
Если ваш приложение нуждается в большем контроле над функциями, специфичными для конкретного протокола, тогда вы можете ограничить requestUri поддерживаемой схемой(ами) и привести WebRequest к соответствующему подклассу, специфичному для протокола. Это ограничивает протоколы, поддерживаемые вашим приложением, но позволяет настраивать функции, зависящие от протокола.
Comments