2009-05-22 11 views
101

ho visto questo pezzo di codice:C# HttpWebRequest vs WebRequest

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

Perché avete bisogno di gettare (HttpWebRequest)? Perché non usare solo HttpWebRequest.Create? E perché lo HttpWebRequest.Create crea un WebRequest, non uno HttpWebRequest?

+0

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

risposta

130

Il metodo Create è statico ed esiste solo su WebRequest. Chiamarlo come HttpWebRequest.Create potrebbe sembrare diverso, ma in realtà è compilato per chiamare WebRequest.Create. Sembra solo essere su HttpWebRequest a causa dell'ereditarietà.

Il metodo Create internamente, utilizza lo schema di fabbrica per eseguire la creazione effettiva di oggetti, in base allo Uri inserito. Potresti effettivamente recuperare altri oggetti, ad esempio FtpWebRequest o FileWebRequest, a seconda dello Uri.

+3

Questo è giusto. Sarebbe stato bello se ci fosse un modo per ottenere una HttpWebRequest da HttpWebRequest.Create o qualcosa come HttpWebRequest.CreateHttp senza casting. Il primo sarebbe qualcosa di simile al nuovo statico pubblico HttpWebRequest Create (stringa url). In entrambi i casi, se l'url non era HTTP (s), dovrebbe solo lanciare qualche InvalidArgumentException. –

+4

Una spiegazione molto bella di una strana decisione di progettazione (oserei dire sbagliata?) Dai creatori .NET. –

+2

@ I.J.Kennedy Sono completamente d'accordo, una decisione di design molto strana, illogica e poco pratica. – Aidiakapi

27

WebRequest è una classe astratta, che ha un metodo factory Create che, in base all'URL inoltrato, crea un'istanza di una sottoclasse concreta. Se avete bisogno o volete HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl); invece di WebRequest req = WebRequest.Create(strUrl); dipende dalle vostre esigenze, e da che tipo di URL si passa

Se si passa solo in HTTP:. URL, poi l'ex codice consente di accedere alle proprietà e metodi la sottoclasse HttpWebRequest implementa in aggiunta a quelli definiti nella classe base WebRequest. Ma se hai passato un FTP: URL, il tentativo di trasmettere a HttpWebRequest fallirebbe.

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

- via Martin Honnen

10

Il cast è necessaria solo quando è necessario l'accesso ai membri unici a HttpWebRequest. L'idea è che se le proprietà/metodi supportati su WebRequest sono sufficienti, è possibile scrivere un'applicazione che funzioni contro 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 richiede un maggiore controllo sulle funzionalità specifiche di un particolare protocollo, è possibile limitare requestUri ai propri schemi supportati e inoltrare WebRequest alla sottoclasse specifica del protocollo appropriata. Ciò limita i protocolli supportati dall'applicazione, ma consente di modificare funzionalità specifiche del protocollo.