C # HttpWebRequest vs WebRequest


112

Ho visto questo pezzo di codice:

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

Perché devi trasmettere (HttpWebRequest)? Perché non basta usare HttpWebRequest.Create? E perché HttpWebRequest.Createcrea una WebRequest, non una HttpWebRequest?


Risposte:


134

Il Createmetodo è statico ed esiste solo su WebRequest. Chiamarlo come HttpWebRequest.Createpotrebbe sembrare diverso, ma in realtà è compilato per chiamare WebRequest.Create. Sembra essere acceso solo a HttpWebRequestcausa dell'eredità.

Il Createmetodo internamente utilizza il pattern di fabbrica per eseguire la creazione effettiva degli oggetti, in base a ciò che gli Urisi passa. Potresti effettivamente recuperare altri oggetti, come un FtpWebRequesto FileWebRequest, a seconda del file Uri.


3
È giusto. Sarebbe stato bello se ci fosse un modo per ottenere un HttpWebRequest da HttpWebRequest.Create o qualcosa di simile HttpWebRequest.CreateHttp senza casting. Il primo sarebbe qualcosa di simile a public new static HttpWebRequest Create (string url). In ogni caso, se l'URL non era HTTP, dovrebbe semplicemente generare un'eccezione InvalidArgumentException.
Matthew Flaschen,

4
Una spiegazione molto carina di una decisione di progettazione molto strana (oserei dire sbagliata?) Da parte dei creatori di .NET.
IJ Kennedy

2
@ IJKennedy Sono completamente d'accordo, una decisione di progettazione molto strana, illogica e poco pratica.
Aidiakapi

8
HttpWebRequest.CreateHttp esiste e crea un'istanza HttpWebRequest.
Peter Meinl

4
@Bobson WebRequest.CreateHttpè in 4.5
Mark

31

WebRequestè una classe astratta, che ha un metodo factory Createche, a seconda dell'URL passato, crea un'istanza di una sottoclasse concreta. Se hai bisogno o vuoi HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);invece WebRequest req = WebRequest.Create(strUrl);dipende dalle tue esigenze e dal tipo di URL che passi.

Se passi solo HTTP: URL, il codice precedente ti consente di accedere alle proprietà e ai metodi HttpWebRequestimplementati dalla sottoclasse oltre a quelli definiti nella classe base WebRequest. Ma se hai passato un FTP: URL, il tentativo di eseguire il cast HttpWebRequestfallirà.

Quest'ultimo è generico e non fallirà su nessuno dei tipi di URL supportati, ma ovviamente senza eseguire il cast a nessuna sottoclasse è possibile accedere solo alle proprietà e ai metodi definiti dalla classe base.

- tramite Martin Honnen


12

Il cast è necessario solo quando è necessario accedere ai membri univoci di HttpWebRequest. L'idea è che se le proprietà / metodi supportati su WebRequest sono sufficienti, è possibile scrivere un'applicazione che funzionerà con molti tipi di protocolli di richiesta / risposta. In questo caso l'URI potrebbe essere qualcosa fornito dall'utente utilizzando qualsiasi protocollo supportato da protocolli collegabili. Nuovi protocolli possono anche essere supportati senza alterare il software originale.

Se l'applicazione necessita di un maggiore controllo sulle funzionalità specifiche di un particolare protocollo, è possibile limitare requestUri agli schemi supportati e trasmettere WebRequest alla sottoclasse specifica del protocollo appropriata. Ciò limita i protocolli supportati dall'applicazione, ma consente di modificare le funzionalità specifiche del protocollo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.