मैं HttpWebRequest
का उपयोग कर रहा हूं, और प्रतिक्रिया स्ट्रीम का निपटारा कर रहा हूं। क्या HttpWebRequest
का निपटान करने का कोई सही तरीका है, क्योंकि इसमें कोई करीबी या निपटान विधि नहीं है?क्या httpwebrequest का निपटान करने का कोई सही तरीका है?
उत्तर
तो वर्ग विशेष निपटान आवश्यकताओं, यह IDisposable को लागू किया है होता था। चूंकि यह आईडीस्पोजेबल को लागू नहीं करता है, इसलिए आप मान सकते हैं कि आपको कुछ भी करने की ज़रूरत नहीं है।
HttpWebRequest IDISposable लागू नहीं करता है इसलिए इसे निपटान की आवश्यकता नहीं है। बस इसके साथ किए जाने के बाद httprequest ऑब्जेक्ट को शून्य पर सेट करें।
आशा है कि यह मदद करता है
क्यों सेट शून्य पर? बस इसे छोड़ने के लिए जीसी के लिए पर्याप्त है ..... –
httpwebRequest IDISposable लागू नहीं करता है क्योंकि यह स्ट्रीम बना सकता है, जो IDISposable लागू करता है। इस तरह, आपको इसे निपटाने के बारे में चिंता नहीं करनी चाहिए।
आप हालांकि चिंतित हैं, तो आप WebClient, जो IDisposable है का उपयोग करना चाहते हो सकता है:
using (WebClient c = new WebClient())
{
using (Stream stream = c.OpenRead(url))
{
//
}
}
आप उपयोग कर सकते हैं:
var webRequest = WebRequest.Create(ActionUrl)
using (var webResponse = webRequest.GetResponse())
{}
अपने कार्यान्वयन के लिए
। जब मैंने WebRequest क्लास का उपयोग बहुत कम समय सीमा में एकाधिक अनुरोधों को बंद करने के लिए किया है, तो एक उपयोग ब्लॉक में GetResponse() को लपेटने से ऐप को लटकने से रोका गया है।
मेरे पास एक समान प्रश्न था, और यहां दिए गए उत्तरों ने मुझे आवश्यक जानकारी नहीं दी। तो भले ही एक स्वीकार्य उत्तर है, मैं अगले व्यक्ति की मदद करने के लिए जो कुछ सीखा है उसे जोड़ने जा रहा हूं।
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
है) प्रत्येक उपरोक्त प्रत्येक उदाहरण के लिए प्रत्येक के अपने कनेक्शन का उपयोग करता है, जितनी जल्दी हो सके उन्हें बंद कर देता है। संपूर्ण कनेक्ट/भेजें/प्राप्त/डिस्कनेक्ट प्रक्रिया इस प्रकार एक सेकंड से भी कम समय में पूर्ण हो सकती है।
:
- आप WebRequest.InitializeLifetimeService उपयोग कर सकते हैं एक ILease प्राप्त करने के लिए, पट्टे पर मूल्यों में परिवर्तन, तब तक यहां समय समाप्ति को प्रभावित नहीं करता।
- WebRequest का उपयोग करने के बजाय, आप WebClient का उपयोग कर सकते हैं, जो निपटान का समर्थन करता है। हालांकि अंतर्निहित टीसीपी कनेक्शन अभी भी निपटान के बाद भी 2 मिनट के लिए लटका हुआ है।
अंत में: कह रही है कि आप नीचे बंद एक HttpWebClient आम तौर पर सच हो सकता है के बारे में चिंता करने की जरूरत नहीं है, लेकिन वहाँ निहितार्थ आप के बारे में पता होने के लिए चाहते हो सकता है कर रहे हैं। इस व्यवहार के लिए अच्छे कारण हैं, लेकिन आप यह तय नहीं कर सकते कि यह आपके विशेष एप्लिकेशन के लिए अच्छा है या नहीं, अगर आपको नहीं पता कि यह हो रहा है।
FWIW
- 1. क्वार्ट्ज.NET का निपटान करने का सही तरीका?
- 2. एक WPF विंडो का निपटान करने का सही तरीका क्या है?
- 3. scala.io.Source का उपयोग करने का सही तरीका क्या है?
- 4. TypeForwardedToAttribute का उपयोग करने का सही तरीका क्या है?
- 5. फोन नंबरों का प्रतिनिधित्व करने का सही तरीका क्या है?
- 6. क्या ऐसा करने का कोई तरीका है?
- 7. जावा में कोई तारीख बनाने का सही तरीका क्या है?
- 8. क्या कोई शर्त सही है, तो jQuery चेनिंग की शाखा को करने का कोई तरीका है
- 9. क्या विंडोज फोन 8 में IAsyncResult का इंतजार करने का कोई तरीका है?
- 10. क्या कोई एसबीटी का उपयोग करने का सही तरीका बता सकता है?
- 11. मैनेशिया डेटाबेस बैकअप/पुनर्स्थापित करने का सही तरीका क्या है?
- 12. एसपीओजे डायहार्ड को हल करने का सही तरीका क्या है?
- 13. क्या एसिंक विधि का परीक्षण करने का कोई तरीका है?
- 14. क्या PHP का एफ़टीपी शुरू करने का कोई तरीका है?
- 15. ग्रैफेम पाने का सही तरीका क्या है?
- 16. पुनः निर्देशित करने का सही तरीका क्या है?
- 17. रेल में class_attribute प्रारंभ करने का सही तरीका क्या है?
- 18. क्या एमवीवीएम लागू करने का यह सही तरीका है?
- 19. एसएएसएस, मिश्रण को कॉल करने का सही तरीका क्या है?
- 20. सी में पॉइंटर शुरू करने का सही तरीका क्या है?
- 21. रत्न प्रकाशित करने का वर्तमान सही तरीका क्या है?
- 22. एरलांग इंडेंट करने का सही तरीका क्या है?
- 23. सीपीएएन पर खाता प्राप्त करने का सही तरीका क्या है?
- 24. जावा में प्रमाणीकृत एन्क्रिप्शन करने का सही तरीका क्या है?
- 25. जावास्क्रिप्ट टैग को प्रारूपित करने का सही तरीका क्या है?
- 26. PowerShell में त्रुटि प्रबंधन करने का सही तरीका क्या है?
- 27. बड़े ISTreams को प्रबंधित करने का सही तरीका क्या है?
- 28. एच 2 बंद करने का सही तरीका क्या है?
- 29. मीडिया नियंत्रक को डिस्कनेक्ट करने का सही तरीका क्या है?
- 30. PHP में निर्भरता लोड करने का सही तरीका क्या है?
ऐसे परिदृश्य हैं जहां यह तुरंत दायरे से बाहर नहीं जाता है - विशेष रूप से जब आप कम समय के भीतर कई वेब अनुरोध बना रहे हैं । यदि आपको इसका निपटान करने की आवश्यकता है तो इसे केवल 'आईडीस्पोजेबल' पर डालें और फिर उस पर 'निपटान करें) विधि को कॉल करें। –
@mee इससे कोई फर्क नहीं पड़ता। 'HttpWebRequest'' IDisposable' लागू नहीं करता है। –