WebClient बनाम HttpWebRequest / HttpWebResponse


132

यह मुझे लगता है कि जो कुछ भी पूरा किया HttpWebRequest/Responseजा सकता है वह WebClientवर्ग के साथ भी पूरा किया जा सकता है । मैंने कहीं पढ़ा कि WebClientयह एक उच्च स्तरीय आवरण है WebRequest/Response
अब तक, मैं ऐसा कुछ भी नहीं देख सकता जिसे पूरा किया जा सकता है, जिसके साथ पूरा HttpWebRequest/Responseनहीं किया जा सकता WebClientऔर न ही जहां HttpWebRequest / Response आपको अधिक "फाइन-ग्रेन्ड" नियंत्रण देगा।

मुझे WebClient का उपयोग कब करना चाहिए और कब करना चाहिए HttpWebRequest/Response? (जाहिर है, HttpWebRequest/ResponseHTTP विशिष्ट हैं।)

यदि HttpWebRequest/Responseनिचले स्तर पर हैं WebClient, तो मैं HttpWebRequest/Responseउस के साथ क्या कर सकता हूं जिसे मैं पूरा नहीं कर सकता हूं WebClient?

जवाबों:


87

उपयोग करने HttpWebRequestसे आपको अनुरोध पर अधिक नियंत्रण मिलता है। आप कुकीज़, हेडर, प्रोटोकॉल, आदि सेट कर सकते हैं ... प्रतिक्रिया में, आप कुकीज़ और हेडर को भी पुनः प्राप्त कर सकते हैं


14
थॉमस, अभी भी आश्वस्त नहीं हैं ... WebClient में एक हेडर्स प्रॉपर्टी है, आप कुकी को इस तरह से पुनः प्राप्त कर सकते हैं: स्ट्रिंग कुकी = webClient.ResponseHeaders ("सेट-कुकी") और इसे सेट करें: webClient.Headers.Add ("कुकी", " CommunityServer-UserCookie ... ");
डैन

14
HttpWebRequest का उपयोग करके आप टाइमआउट को परिभाषित कर सकते हैं। WebClient में, यह असंभव है।
ripper234

14
@ ripper234, वास्तव में यह है संभव: तुम सिर्फ इनहेरिट WebClient करने के लिए है और HttpWebRequest अनुकूलित करने के लिए GetWebRequest ओवरराइड
थॉमस लेवेस्क

15
@ThomasLevesque यदि आप वेबक्लेर को विरासत में प्राप्त कर रहे हैं और वेबरेक्स्ट को ओवरराइड कर रहे हैं, तो यह वेबक्लाइंट का उपयोग करने के लिए व्यर्थ लगता है ...
हैगई एल

5
@ हैगईएल, मैं असहमत हूं ... आपको मैन्युअल रूप से पूरे अनुरोध को बनाने की आवश्यकता नहीं है, आप base.GetWebRequestइसे बनाने के लिए उपयोग कर सकते हैं और फिर आप जो चाहते हैं उसे अनुकूलित कर सकते हैं
थॉमस लेवेस्क

54

HttpWebRequest बहुत अधिक सामान को उजागर करता है जो आपको ठीक-ठाक प्रोटोकॉल नियंत्रण की अनुमति देता है, उदाहरण के लिए: क्या आप Keep-Alive का उपयोग करना चाहते हैं, क्या कनेक्शन पूल का उपयोग करना है, क्या बफर लिखना है या नहीं, आदि।

WebClientउन सभी को उजागर नहीं करता है (हालांकि आप WebClientअंतर्निहित अनुरोध ऑब्जेक्ट से उप-श्रेणी और स्थान से हटा सकते हैं )।

WebClient(: पोस्ट / प्राप्त / फार्म अपलोड जैसे) और बनाने और प्रबंधित करने परेशान होना नहीं कर सकते उन स्थितियों में, जहां आप बस एक ऑपरेशन करना चाहते हैं के लिए उपयोगी है HttpWebRequest, RequestStream, HttpWebResponse, और प्रतिक्रिया स्ट्रीम।


13
इसके अलावा, एक और बात है जिसका मैं उल्लेख करना भूल गया। WebClient एक घटक वस्तु है, जबकि HttpWebRequest नहीं है। इसका क्या मतलब है? ठीक है, यदि आप GUI ऐप बनाने के लिए VisualStudio का उपयोग कर रहे हैं, तो आप अपने प्रपत्र पर WebClient घटक को ड्रैग / ड्रॉप कर सकते हैं और इसका उपयोग HTTP / FTP आदि सर्वरों के लिए अनुरोध जारी करने के लिए कर सकते हैं।
1:11 बजे फिरोज

14

टिम हीर के ब्लॉग से - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

सिल्वरलाइट के बजाय आप WebClient या HttpWebRequest का उपयोग करना चाहते हैं। क्या फर्क पड़ता है? यहाँ टाइमहीर संस्करण है। WebClient एक सरल कार्यान्वयन है जो GET अनुरोधों को वास्तव में आसानी से करता है और एक प्रतिक्रिया स्ट्रीम प्राप्त करता है। HttpWebRequest के लिए बहुत अच्छा है जब आपको अनुरोध पर थोड़ा अधिक दानेदार नियंत्रण की आवश्यकता होती है, हेडर या अन्य अनुकूलन भेजने की आवश्यकता होती है।


7
WebClient, POST को UploadString, UploadData और UploadFile के साथ भी अनुमति देता है
थॉमस Levesque

@ThomasLevesque क्या आज कक्षाओं का एक नया संस्करण है? मैं देख रहा हूं कि यह चर्चा थोड़ी है, हम्म ... वृद्ध ...
कोनराड विल्टर्स्टन

@KonradViltersten, मुझे नहीं लगता कि WebClient वर्ग में बहुत बदलाव आया है। नए ऐप्स के लिए मेरा सुझाव है कि आप इसके बजाय HttpClient का उपयोग करें, जो कि उपयोग करना बहुत आसान है और बहुत अधिक लचीला है।
थॉमस लेवेस्क

1
@ThomasLevesque राइट, वह था जिसके बारे में मैं सोच रहा था। मैंने http को कक्षा के नाम के अंतर के रूप में याद किया और Http ... भाग द्वारा गुमराह किया गया । अब मैं सही रास्ते पर आ गया हूं। धन्यवाद!
कोनराड विल्टरनोट

12

WebClient यूजर इंटरफेस धागे पर वर्ग रन है, तो यूजर इंटरफेस है, जबकि डेटा इंटरनेट से डाउनलोड किया जा रहा है उत्तरदायी नहीं है। दूसरी ओर, HttpWebRequest वर्ग उपयोगकर्ता इंटरफ़ेस थ्रेड को ब्लॉक नहीं करता है, और आपका एप्लिकेशन उत्तरदायी है। इसलिए, ऐसे ऐप्स में जहां इंटरनेट से बड़ी मात्रा में डेटा डाउनलोड किया जाना है या यदि डेटा का स्रोत पहुंचने में धीमा है, तो आपको HttpWebRequest वर्ग का उपयोग करना चाहिए; अन्य सभी मामलों में, आपको WebClient वर्ग का उपयोग करना चाहिए।


1
विपरीत WP7 पर सच है। HttpWebRequest मार्श मैंगो में UI थ्रेड पर वापस जाता है, जिससे मुझे अभी दुःख का कोई अंत नहीं है। ग्र्र
कैमरून मैकफारलैंड

6
WebClient अतुल्यकालिक तरीकों के साथ-साथ समर्थन करता है।
साइबरमॉक

6

इसका एक और नुकसान WebClientयह है कि जब आप प्रतिक्रिया पाठ प्राप्त करने के लिए इसका उपयोग करते हैं तो HTTP ContentTypeके charsetमूल्य को अनदेखा कर देता है । आपको Encodingसंपत्ति के माध्यम से एन्कोडिंग को स्पष्ट रूप से सेट करना होगा ।


यह लाभप्रद है; और यह केवल स्थापित करने की बात नहीं है Encoding- आप अनुरोध के बाद तक एन्कोडिंग को नहीं जान सकते हैं, इसलिए WebClient एपीआई यह बहुत संभावना नहीं बनाता है कि आप एक अज्ञात एन्कोडिंग में एक स्ट्रिंग को ठीक से डाउनलोड करने में सक्षम होने जा रहे हैं।
ईमोन नेरबोन

5

एक और बात HttpWebrquest आपको संपीड़न की अनुमति देता है लेकिन वह Net.WebClient वर्ग HTTP संपीड़न का समर्थन नहीं करता है


3
जैसे WebClient के अन्य सभी उदाहरण कुछ विवरणों को छिपाते हैं, यह WebClient को ओवरक्लास करके और ओवरराइड करके तय किया जा सकता है GetWebRequest। इस स्थिति में, आप बस अंतर्निहित HttpWebRequest.AutomaticDecompressiongसंपत्ति को ट्वीक करते हैं )।
Patridge

5

"HtttpWebRequest" .NET 4.5 में अप्रचलित है। अब, यह वर्ग केवल आंतरिक है।


2
वास्तव में। WebRequestइसके बजाय उपयोग करें ।
रेशमकीट

2
वर्ग अप्रचलित नहीं है, निर्माता हैं। और वर्ग आंतरिक नहीं है, यह अभी भी सार्वजनिक है।
user247702

2

एक उदाहरण: डेटा पोस्ट करना और एक अनुरोध / प्रतिक्रिया चक्र में संसाधित डेटा वापस प्राप्त करना WebClient के साथ असंभव लगता है, लेकिन आप HtttpWebRequest के साथ ऐसा कर सकते हैं।


2
बस POST करने के लिए WebClient.UploadString या WebClient.UploadData का उपयोग करें और प्रतिक्रिया स्ट्रिंग या बाइट सरणी प्राप्त करें।
samjudson

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