C# HttpWebRequest vs WebRequest



Я видел этот кусок кода:



var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");


зачем вам нужно бросать (HttpWebRequest)? Почему бы просто не использовать HttpWebRequest.Create? И почему же HttpWebRequest.Create сделать WebRequest, а не HttpWebRequest?

552   3  

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

    Ничего не найдено.