C # HttpWebRequest vs WebRequest

J’ai vu ce morceau de code:

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

Pourquoi avez-vous besoin de lancer (HttpWebRequest) ? Pourquoi ne pas simplement utiliser HttpWebRequest.Create ? Et pourquoi HttpWebRequest.Create fait-il un WebRequest , pas un HttpWebRequest ?

La méthode Create est statique et n’existe que sur WebRequest . L’appeler comme HttpWebRequest.Create pourrait avoir un aspect différent, mais il est en réalité compilé en appelant WebRequest.Create . Il semble seulement être sur HttpWebRequest raison de l’inheritance.

La méthode Create interne utilise le modèle de fabrique pour créer des objects, en fonction de l’ Uri vous lui transmettez. Vous pouvez en fait récupérer d’autres objects, comme FtpWebRequest ou FileWebRequest , en fonction de l’ FileWebRequest .

WebRequest est une classe abstraite qui possède une méthode de Create qui, selon l’URL transmise, crée une instance d’une sous-classe concrète. Si vous avez besoin ou voulez HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl); au lieu de WebRequest req = WebRequest.Create(strUrl); dépend de vos besoins et du type d’URL que vous transmettez.

Si vous ne transmettez que HTTP: URL, l’ancien code vous permet d’accéder aux propriétés et méthodes de la sous-classe HttpWebRequest en plus de celles définies sur la classe de base WebRequest . Mais si vous avez passé une adresse FTP: URL, la tentative de HttpWebRequest en HttpWebRequest échoue.

Ce dernier est générique et n’échouera sur aucun des types d’URL pris en charge, mais bien sûr, sans conversion en sous-classe, vous ne pouvez accéder qu’aux propriétés et méthodes définies par la classe de base.

– via Martin Honnen

Le transtypage n’est nécessaire que lorsque vous avez besoin d’accéder aux membres uniques de HttpWebRequest. L’idée est que si les propriétés / méthodes sockets en charge sur WebRequest sont suffisantes, vous pouvez écrire une application qui fonctionnera contre de nombreux types de protocoles de requête / réponse. Dans ce cas, l’URI pourrait être quelque chose donné par l’utilisateur en utilisant n’importe quel protocole pris en charge par les protocoles enfichables. De nouveaux protocoles peuvent même être pris en charge sans modifier le logiciel d’origine.

Si votre application a besoin de davantage de contrôle sur les fonctionnalités spécifiques à un protocole particulier, vous pouvez limiter requestUri à vos schémas pris en charge et convertir WebRequest en sous-classe spécifique au protocole. Cela limite les protocoles pris en charge par votre application, mais vous permet de modifier les fonctionnalités spécifiques au protocole.