C # HttpWebRequest проти WebRequest


112

Я побачив цей фрагмент коду:

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

Для чого потрібно робити кастинг (HttpWebRequest)? Чому б просто не використовувати HttpWebRequest.Create? І навіщо HttpWebRequest.Createробити а WebRequest, а не HttpWebRequest?


після пов'язаних з : stackoverflow.com/q/8209781/274502
cregox

Відповіді:


134

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.
IJ Kennedy

2
@IJKennedy Я повністю погоджуюся, дуже дивне, нелогічне та непрактичне дизайнерське рішення.
Айдіакапі

8
HttpWebRequest.CreateHttp існує і створює екземпляр HttpWebRequest.
Пітер Майнл

4
@Bobson WebRequest.CreateHttpвиходить у 4,5
Марк

31

WebRequestце абстрактний клас, який має заводський метод, Createякий залежно від переданої URL-адреси створює екземпляр конкретного підкласу. Вам потрібно чи хочете HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);замість цього, WebRequest req = WebRequest.Create(strUrl);залежить від ваших потреб та від того, які URL-адреси ви передаєте.

Якщо ви передаєте лише HTTP: URL-адреси, то колишній код дозволяє отримати доступ до властивостей та методів, які підклас HttpWebRequestреалізує на додаток до тих, що визначені в базовому класі WebRequest. Але якщо ви перейшли в FTP: URL, то спроба передати це HttpWebRequestбуде невдалою.

Останнє є загальним і не вийде з ладу для будь-якого з типів підтримуваних URL-адрес, але, звичайно, без введення будь-якого підкласу ви можете отримати доступ лише до властивостей та методів, які визначає базовий клас.

- через Мартіна Гоннена


12

Акторський склад необхідний лише тоді, коли вам потрібен доступ до членів, унікальних для HttpWebRequest. Ідея полягає в тому, що якщо властивостей / методів, підтримуваних у WebRequest, достатньо, ви можете написати програму, яка буде працювати проти багатьох типів протоколів запитів / відповідей. У цьому випадку URI може бути чимось заданим користувачем за допомогою будь-якого протоколу, підтримуваного підключаються протоколами. Нові протоколи можна навіть підтримувати без зміни оригінального програмного забезпечення.

Якщо вашій програмі потрібен більший контроль над функціями, характерними для конкретного протоколу, ви можете обмежити requestUri до підтримуваних схем (ів) і передати WebRequest у відповідний підклас, що стосується протоколу. Це обмежує протоколи, що підтримуються вашою програмою, але дозволяє налаштувати особливості протоколу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.