2009-05-22 4 views
101

Я видел этот кусок кода:C# HttpWebRequest против WebRequest

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

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

+0

post-related: http://stackoverflow.com/q/8209781/274502 – cregox

ответ

130

Метод Create является статическим и существует только на WebRequest. Вызов HttpWebRequest.Create может выглядеть по-другому, но на самом деле он скомпилирован до WebRequest.Create. Кажется, что он только на HttpWebRequest из-за наследования.

Метод Create внутренне использует шаблон фабрики для фактического создания объектов на основе Uri, которые вы передаете ему. Вы могли бы вернуть другие объекты, например FtpWebRequest или FileWebRequest, в зависимости от Uri.

+3

Это право. Было бы неплохо, если бы был способ получить HttpWebRequest из HttpWebRequest.Create или что-то вроде HttpWebRequest.CreateHttp без кастинга. Первым будет что-то вроде публичного нового статического HttpWebRequest Create (строковый url). В любом случае, если URL не был HTTP (-ами), он должен просто выбросить InvalidArgumentException. –

+4

Очень приятное объяснение очень странного дизайнерского решения (смею сказать неправильно) создателей .NET. –

+2

@ I.J.Kennedy Я полностью согласен, очень странное, нелогичное и непрактичное дизайнерское решение. – Aidiakapi

27

WebRequest - абстрактный класс, который имеет фабричный метод Create, который, в зависимости от переданного URL, создает экземпляр конкретного подкласса. Если вам нужно или хотите HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl); вместо WebRequest req = WebRequest.Create(strUrl); зависит от ваших потребностей, а также о том, какие URL, вы передаете в

Если вы передаете только в HTTP:. URL, то первый код позволяет получить доступ к свойствам и методы, подкласс HttpWebRequest реализует в дополнение к тем, которые определены в базовом классе WebRequest. Но если вы перешли по FTP: URL-адрес, попытка сбрасывания на HttpWebRequest потерпит неудачу.

Последний является общим и не будет терпеть неудачу на любом из типов поддерживаемых URL-адресов, но, конечно же, без использования какого-либо подкласса вы можете получить доступ только к свойствам и методам, определяемым базовым классом.

- через Martin Honnen

10

Бросок необходимо только тогда, когда вам необходимо получить доступ к членам уникальные для HttpWebRequest. Идея состоит в том, что если свойств/методов, поддерживаемых в WebRequest, достаточно, вы можете написать приложение, которое будет работать против многих типов протоколов запроса/ответа. В этом случае URI может быть чем-то заданным пользователем, используя любой протокол, поддерживаемый подключаемыми протоколами. Новые протоколы могут поддерживаться без изменения исходного программного обеспечения.

Если ваше приложение нуждается в большем контроле над функциями, относящимися к определенному протоколу, то вы можете ограничить requestUri вашей поддерживаемой схемой (-ами) и бросить WebRequest в соответствующий подкласс протокола. Это ограничивает протоколы, поддерживаемые вашим приложением, но позволяет вам настраивать специфические для протокола функции.

Смежные вопросы