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
क्रेगॉक्स

जवाबों:


134

Createविधि स्थिर है, और केवल पर मौजूद है WebRequest। के रूप में यह कहकर HttpWebRequest.Createअलग दिख सकता है, लेकिन इसकी वास्तव में कॉल करने के लिए संकलित है WebRequest.Create। यह केवल HttpWebRequestवंशानुक्रम के कारण ही प्रतीत होता है ।

Createविधि आंतरिक रूप से, वस्तुओं के वास्तविक निर्माण, के आधार पर करने के लिए कारखाना पैटर्न का उपयोग करता Uriआप इसे करने के लिए गुजरती हैं। आप वास्तव में अन्य वस्तुओं को वापस पा सकते हैं, जैसे FtpWebRequestया FileWebRequest, पर निर्भर करता है Uri


3
यह सही है। यह अच्छा होता अगर HttpWebRequest.Create या HttpWebRequest.CreateHttp जैसी कुछ कास्टिंग के बिना HttpWebRequest पाने का एक तरीका होता। पहला सार्वजनिक नए स्थिर HttpWebRequest Create (string url) जैसा कुछ होगा। किसी भी तरह से, यदि url HTTP (s) नहीं था, तो इसे बस कुछ InvalidArgumentException को फेंक देना चाहिए।
मैथ्यू फ्लैशेन

4
.NET के रचनाकारों द्वारा एक बहुत ही अजीब डिजाइन निर्णय की बहुत अच्छी व्याख्या (मैं गलत कहता हूं?)।
IJ कैनेडी

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: URLs में पास होते हैं, तो पूर्व कोड आपको गुण और विधियों HttpWebRequestको आधार वर्ग पर परिभाषित लोगों के अलावा उपवर्ग लागू करने की अनुमति देता है WebRequest। लेकिन अगर आप एक FTP: URL में पास हुए हैं, तो कास्ट करने का प्रयास HttpWebRequestविफल हो जाएगा।

उत्तरार्द्ध सामान्य है और समर्थित URL के किसी भी प्रकार पर विफल नहीं होगा, लेकिन बिना किसी उपवर्ग के कास्टिंग के बिना आप केवल आधार वर्ग को परिभाषित करने वाले गुणों और विधियों तक पहुंच सकते हैं।

- मार्टिन होनन के माध्यम से


12

कलाकारों को केवल तब आवश्यक होता है जब आपको HttpWebRequest के लिए अद्वितीय सदस्यों तक पहुंच की आवश्यकता होती है। विचार यह है कि यदि WebRequest पर समर्थित गुण / विधियाँ पर्याप्त हैं, तो आप एक एप्लिकेशन लिख सकते हैं जो कई प्रकार के अनुरोध / प्रतिक्रिया प्रोटोकॉल के विरुद्ध काम करेगा। इस मामले में यूआरआई प्लग -ेबल प्रोटोकॉल द्वारा समर्थित किसी भी प्रोटोकॉल का उपयोग करके उपयोगकर्ता द्वारा दिया जा सकता है। मूल प्रोटोकॉल में फेरबदल के बिना भी नए प्रोटोकॉल का समर्थन किया जा सकता है।

यदि आपके एप्लिकेशन को किसी विशेष प्रोटोकॉल के लिए विशिष्ट विशेषताओं पर अधिक नियंत्रण की आवश्यकता है, तो आप अपनी समर्थित योजना (ओं) को प्रतिबंधित कर सकते हैं और WebRequest को उपयुक्त प्रोटोकॉल-विशिष्ट उपवर्ग में डाल सकते हैं। यह आपके एप्लिकेशन द्वारा समर्थित प्रोटोकॉल को सीमित करता है, लेकिन आपको प्रोटोकॉल-विशिष्ट विशेषताओं को ट्विक करने में सक्षम बनाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.