C # HttpWebRequest vs WebRequest

112

Ich habe diesen Code gesehen:

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

Warum musst du gießen (HttpWebRequest)? Warum nicht einfach benutzen HttpWebRequest.Create? Und warum macht HttpWebRequest.Createa WebRequest, nicht a HttpWebRequest?

Unbekannt
quelle
post-related: stackoverflow.com/q/8209781/274502
cregox

Antworten:

134

Die CreateMethode ist statisch und existiert nur auf WebRequest. Das Aufrufen HttpWebRequest.Createsieht vielleicht anders aus, ist aber tatsächlich auf das Aufrufen beschränkt WebRequest.Create. Es scheint nur eingeschaltet zu seinHttpWebRequest wegen der Vererbung eingeschaltet zu sein.

Die CreateMethode verwendet intern das Factory-Muster, um Objekte tatsächlich zu erstellen, basierend auf dem, was UriSie an sie übergeben. Sie könnten tatsächlich andere Objekte wie ein FtpWebRequestoder zurückbekommen FileWebRequest, abhängig von der Uri.

David Wengier
quelle
3
Dies ist richtig. Es wäre schön gewesen, wenn es eine Möglichkeit gegeben hätte, eine HttpWebRequest entweder von HttpWebRequest.Create oder von etwas wie HttpWebRequest.CreateHttp ohne Casting zu erhalten. Das erste wäre so etwas wie ein öffentliches neues statisches HttpWebRequest Create (String-URL). In beiden Fällen sollte die URL, wenn sie nicht HTTP (s) war, nur eine InvalidArgumentException auslösen.
Matthew Flaschen
4
Eine sehr schöne Erklärung einer sehr seltsamen Designentscheidung (darf ich falsch sagen?) Der .NET-Entwickler.
IJ Kennedy
2
@IJKennedy Ich stimme vollkommen zu, eine sehr seltsame, unlogische und unpraktische Designentscheidung.
Aidiakapi
8
HttpWebRequest.CreateHttp ist vorhanden und erstellt eine HttpWebRequest-Instanz.
Peter Meinl
4
@ Bobson WebRequest.CreateHttpist in 4.5
Mark
31

WebRequestist eine abstrakte Klasse mit einer Factory-Methode Create, die abhängig von der übergebenen URL eine Instanz einer konkreten Unterklasse erstellt. Egal , ob Sie wollen oder müssen , HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);anstatt WebRequest req = WebRequest.Create(strUrl);hängt von Ihren Bedürfnissen, und auf welche Art von URLs , die Sie passieren in.

Wenn Sie nur HTTP: URLs übergeben, können Sie mit dem vorherigen Code HttpWebRequestzusätzlich zu den in der Basisklasse definierten Eigenschaften und Methoden auf die Eigenschaften und Methoden zugreifen, die die Unterklasse implementiert WebRequest. Aber wenn Sie eine FTP: URL übergeben haben, dann der Versuch, zu übertragenHttpWebRequest fehl.

Letzteres ist generisch und schlägt bei keinem der unterstützten URL-Typen fehl. Ohne Casting in eine Unterklasse können Sie natürlich nur auf die Eigenschaften und Methoden zugreifen, die die Basisklasse definiert.

- über Martin Honnen

Orhan Cinar
quelle
12

Die Besetzung ist nur erforderlich, wenn Sie Zugriff auf Mitglieder benötigen, die nur für HttpWebRequest gelten. Die Idee ist, dass Sie, wenn die von WebRequest unterstützten Eigenschaften / Methoden ausreichen, eine Anwendung schreiben können, die gegen viele Arten von Anforderungs- / Antwortprotokollen funktioniert. In diesem Fall kann der URI vom Benutzer unter Verwendung eines beliebigen Protokolls angegeben werden, das von steckbaren Protokollen unterstützt wird. Neue Protokolle können sogar unterstützt werden, ohne die ursprüngliche Software zu ändern.

Wenn Ihre Anwendung mehr Kontrolle über Funktionen benötigt, die für ein bestimmtes Protokoll spezifisch sind, können Sie requestUri auf Ihre unterstützten Schemata beschränken und WebRequest in die entsprechende protokollspezifische Unterklasse umwandeln. Dies schränkt die von Ihrer Anwendung unterstützten Protokolle ein, ermöglicht es Ihnen jedoch, protokollspezifische Funktionen zu optimieren.

Kevin
quelle