2009-04-04 35 views
28

मैं HttpWebRequest का उपयोग कर रहा हूं, और प्रतिक्रिया स्ट्रीम का निपटारा कर रहा हूं। क्या HttpWebRequest का निपटान करने का कोई सही तरीका है, क्योंकि इसमें कोई करीबी या निपटान विधि नहीं है?क्या httpwebrequest का निपटान करने का कोई सही तरीका है?

उत्तर

39

तो वर्ग विशेष निपटान आवश्यकताओं, यह IDisposable को लागू किया है होता था। चूंकि यह आईडीस्पोजेबल को लागू नहीं करता है, इसलिए आप मान सकते हैं कि आपको कुछ भी करने की ज़रूरत नहीं है।

+0

ऐसे परिदृश्य हैं जहां यह तुरंत दायरे से बाहर नहीं जाता है - विशेष रूप से जब आप कम समय के भीतर कई वेब अनुरोध बना रहे हैं । यदि आपको इसका निपटान करने की आवश्यकता है तो इसे केवल 'आईडीस्पोजेबल' पर डालें और फिर उस पर 'निपटान करें) विधि को कॉल करें। –

+0

@mee इससे कोई फर्क नहीं पड़ता। 'HttpWebRequest'' IDisposable' लागू नहीं करता है। –

-2

HttpWebRequest IDISposable लागू नहीं करता है इसलिए इसे निपटान की आवश्यकता नहीं है। बस इसके साथ किए जाने के बाद httprequest ऑब्जेक्ट को शून्य पर सेट करें।

आशा है कि यह मदद करता है

+14

क्यों सेट शून्य पर? बस इसे छोड़ने के लिए जीसी के लिए पर्याप्त है ..... –

3

httpwebRequest IDISposable लागू नहीं करता है क्योंकि यह स्ट्रीम बना सकता है, जो IDISposable लागू करता है। इस तरह, आपको इसे निपटाने के बारे में चिंता नहीं करनी चाहिए।

आप हालांकि चिंतित हैं, तो आप WebClient, जो IDisposable है का उपयोग करना चाहते हो सकता है:

using (WebClient c = new WebClient()) 
{ 
using (Stream stream = c.OpenRead(url)) 
{ 
// 
} 
} 
2

आप उपयोग कर सकते हैं:

var webRequest = WebRequest.Create(ActionUrl) 
    using (var webResponse = webRequest.GetResponse()) 
    {} 
अपने कार्यान्वयन के लिए

। जब मैंने WebRequest क्लास का उपयोग बहुत कम समय सीमा में एकाधिक अनुरोधों को बंद करने के लिए किया है, तो एक उपयोग ब्लॉक में GetResponse() को लपेटने से ऐप को लटकने से रोका गया है।

14

मेरे पास एक समान प्रश्न था, और यहां दिए गए उत्तरों ने मुझे आवश्यक जानकारी नहीं दी। तो भले ही एक स्वीकार्य उत्तर है, मैं अगले व्यक्ति की मदद करने के लिए जो कुछ सीखा है उसे जोड़ने जा रहा हूं।

1) जैसा कि कुछ अन्य उत्तरों का उल्लेख है, आप using का उपयोग HttpWebRequest/WebRequest से लौटाई गई स्ट्रीम के लिए कर सकते हैं। यह सिर्फ अच्छा मानक सी # प्रोग्रामिंग है।

लेकिन यह वास्तव में ओपी के प्रश्न (या मेरा) को संबोधित नहीं करता है, जो HttpWebRequest ऑब्जेक्ट का निपटान करने के बारे में था।

2) इस तथ्य के बावजूद कि एक HttpWebRequest प्राप्त करने के लिए फ़ंक्शन को 'बनाएं' नाम दिया गया है, कोई भी मिलान नष्ट, बंद, निपटान, या किसी भी अन्य तंत्र को बनाए गए ऑब्जेक्ट से संसाधनों को मुक्त करने के लिए उपलब्ध नहीं है।

यह मूल रूप से वर्तमान में स्वीकृत उत्तर है।

3) लेकिन यहां सभी उत्तरों के बीच एक निहितार्थ है (धाराओं के अलावा) के आसपास की आवश्यकता के लिए कुछ भी महत्वपूर्ण लटका नहीं है। और यह पूरी तरह से सही नहीं है।

ProcMon का उपयोग करना, आप देख सकते हैं TCP Connect, TCP Send और TCP Receive पाए जाते हैं कि जब आप GetResponse() कहते हैं। यही वह है जिसे मैं देखने की उम्मीद करूंगा। लेकिन TCP Disconnect कब होता है? मेरी धारणा यह थी कि प्रतिक्रिया प्राप्त करने के बाद या तो सबसे खराब होने पर यह ऑब्जेक्ट जीसीएड हो जाता है। लेकिन वास्तविकता अधिक दिलचस्प है।

इसके बजाय, कॉल के ठीक बाद 2 मिनट के लिए टीसीपी कनेक्शन सक्रिय रहता है। मेरा पहला विचार यह था कि जीसी के आसपास घूमने में कितना समय लगता है, लेकिन नहीं। आप उन 2 मिनट के लिए जीसी.कोलेक्ट() लूप में बैठ सकते हैं, और यह 2 मिनट तक नहीं जाने देता है।यह कनेक्शन क्लाइंट और सर्वर दोनों पर खुला रहता है, और कनेक्शन को जीवित रखने के लिए उन 2 मिनट के लिए अतिरिक्त नेटवर्क यातायात का कारण बनता है।

एक और दिलचस्प बात यह है कि भले ही आप 'बनाएं' कह रहे हों, इसका मतलब यह नहीं है कि एक और टीसीपी कनेक्शन जरूरी हो जाता है। उदाहरण के लिए, इस पर विचार करें:

static void Doit(string domain) 
{ 
    HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(domain); 

    using (HttpWebResponse response = (HttpWebResponse)hr.GetResponse()) 
     using (Stream receiveStream = response.GetResponseStream()) 
      using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
       Console.WriteLine(readStream.ReadToEnd()); 
} 

अब, अगर मैं के साथ इस फोन:

Doit("http://www.foo.bar"); 

यह 1 TCP कनेक्शन पैदा करेगा। यह 2 मिनट के लिए सक्रिय रहेगा (या जब तक प्रोग्राम बाहर निकलता है)। लेकिन क्या मैं यह कर यदि:

Doit("http://www.foo.bar"); 
Thread.Sleep(20000); 
Doit("http://www.foo.bar"); 

अब यह 1 पहली कॉल के लिए कनेक्शन है, तो पैदा करेगा पुन: उपयोग कि दूसरी कॉल के लिए कनेक्शन। मतलब टीसीपी कनेक्शन कुल 2:20 मिनट के लिए सक्रिय रहेगा। तो भले ही हम 'बनाएं' कह रहे हों, यह स्क्रैच से कनेक्शन नहीं बना रहा है।

अधिकतर यह एक अच्छी बात है। कनेक्शन बनाना (विशेष रूप से एक HTTPS कनेक्शन) एक महंगी प्रक्रिया हो सकती है। एक प्रणाली जो स्वचालित रूप से आपके लिए बचाती है (शायद) एक अच्छी बात है। इस तरह आप वेब पेज के लिए एचटीएमएल को कुशलता से पुनर्प्राप्त कर सकते हैं, फिर किसी भी संबंधित समर्थन फाइलों (सीएसएस, आईएमजी फाइलों, आदि) को कनेक्ट प्रक्रिया के माध्यम से हर बार बिना किसी समस्या के।

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

इन मामलों के लिए, आप HttpWebRequest.KeepAlive के साथ प्रयोग कर सकते हैं। इसे false पर सेट करें (डिफ़ॉल्ट true है) प्रत्येक उपरोक्त प्रत्येक उदाहरण के लिए प्रत्येक के अपने कनेक्शन का उपयोग करता है, जितनी जल्दी हो सके उन्हें बंद कर देता है। संपूर्ण कनेक्ट/भेजें/प्राप्त/डिस्कनेक्ट प्रक्रिया इस प्रकार एक सेकंड से भी कम समय में पूर्ण हो सकती है।

FYI करें

:

  • आप WebRequest.InitializeLifetimeService उपयोग कर सकते हैं एक ILease प्राप्त करने के लिए, पट्टे पर मूल्यों में परिवर्तन, तब तक यहां समय समाप्ति को प्रभावित नहीं करता।
  • WebRequest का उपयोग करने के बजाय, आप WebClient का उपयोग कर सकते हैं, जो निपटान का समर्थन करता है। हालांकि अंतर्निहित टीसीपी कनेक्शन अभी भी निपटान के बाद भी 2 मिनट के लिए लटका हुआ है।

अंत में: कह रही है कि आप नीचे बंद एक HttpWebClient आम तौर पर सच हो सकता है के बारे में चिंता करने की जरूरत नहीं है, लेकिन वहाँ निहितार्थ आप के बारे में पता होने के लिए चाहते हो सकता है कर रहे हैं। इस व्यवहार के लिए अच्छे कारण हैं, लेकिन आप यह तय नहीं कर सकते कि यह आपके विशेष एप्लिकेशन के लिए अच्छा है या नहीं, अगर आपको नहीं पता कि यह हो रहा है।

FWIW

संबंधित मुद्दे