2010-02-12 12 views
9

कुछ दिनों के लिए googling के बाद, मैं वास्तव में वर्णित समस्या हल नहीं कर सकता। उम्मीद है कि यहां एक समाधान मिलेगाGetRequestStream टाइमआउट अपवाद को यादृच्छिक रूप से

मैं उसी सर्वर पर डब्ल्यूसीएफ सेवा को कॉल करते समय संलग्न कोड का उपयोग कर रहा हूं। मैं कॉल WebReq.GetRequestStream() में बेतरतीब ढंग से समय समाप्त त्रुटि मिलती है

जब मैं जांच netstat मुझे लगता है कि कनेक्शन खुला रहता है, तो शायद वहाँ एक समस्या है, लेकिन मैं यह कैसे

 //request inicialization 
     HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(url); 
     WebReq.Method = "POST"; 
     WebReq.ContentType = "application/json; charset=utf-8"; 
     WebReq.ContentLength = buffer.Length; 

     WebReq.Proxy = null; 
     WebReq.KeepAlive = false; //also tried with true 
     WebReq.AllowWriteStreamBuffering = false; //also tried with true 

     //this produces an error 
     using (Stream PostData = WebReq.GetRequestStream()) 
     { 
      PostData.Write(buffer, 0, buffer.Length); 
      PostData.Close(); 
     } 

     //open and read response 
     HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader _Answer = new StreamReader(Answer); 

     WebResp.Close(); 

     //return string 
     return _Answer.ReadToEnd(); 
हल करने के लिए पता नहीं है कर रहा हूँ

टाइमआउट को कुछ समय के निष्क्रिय समय के बाद ज्यादातर फेंक दिया जाता है, लेकिन पंक्ति में पांच या तो अनुरोध के बाद भी। वास्तव में एक पैटर्न नहीं मिल सकता है।

इस कोड के साथ क्या गलत हो सकता है? क्या डब्ल्यूसीएफ सेवा को कॉल करने के लिए कोई अन्य (बेहतर) तरीका है?

उत्तर

12

मुझे नहीं पता कि यह समस्या के लिए निश्चित रूप से ज़िम्मेदार है, लेकिन अगर आप अपवाद नहीं फेंकते हैं तो आप केवल वेब प्रतिक्रिया बंद कर रहे हैं, और आप प्रतिक्रिया स्ट्रीम को कभी बंद नहीं कर रहे हैं। using बयानों का उपयोग करें:

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
{ 
    return reader.ReadToEnd(); 
} 

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

+0

यह थोड़ा बेहतर है, लेकिन मुझे अभी भी टाइमआउट मिल रहा है। तो, यह वास्तव में अजीब है। तो 1 लिंक क्लिक के बाद लोड हो रहा है और लोड हो रहा है और यदि उस समय पृष्ठ पर उसी या किसी अन्य लिंक पर क्लिक करें तो पेज दूसरे या तो लोड हो जाता है। तो कनेक्शन निर्माण के साथ कुछ गड़बड़ है। जैसा कि मुझे लगता है कि – AnzeR

+0

मैंने देखा नहीं था कि यह एक ही मशीन पर था ... मुझे आश्चर्य है कि क्या आप थ्रेड पूल धागे से बाहर हो रहे हैं - क्या ये एक ही प्रक्रिया में हैं? –

+0

मैं .NET प्रोग्रामिंग में काफी नया हूं। कुछ वर्षों से PHP में प्रोग्रामिंग कर रहे हैं, और ऐसी कोई समस्या कभी नहीं देखी गई है। ये चीजें बहुत आसान हैं। तो मुझे यकीन नहीं है कि "थ्रेड पूल धागे से बाहर" के साथ आपका क्या मतलब था? एक अनुरोध के साथ मैं डब्ल्यूसीएफ सेवा के लिए यह HTTP अनुरोध दो या तो बना देता हूं, इसलिए यह एक ही प्रक्रिया/अनुरोध के साथ है। क्या मुझे इन अनुरोधों के लिए कैशिंग का उपयोग करना चाहिए? – AnzeR

0

क्योंकि यह वास्तव में अजीब व्यवहार है क्योंकि मैं जानना चाहता हूं कि डब्ल्यूसीएफ सेवा को कॉल करने के अन्य तरीके हैं, जो एक ही आईआईएस सर्वर पर होस्ट किए गए हैं। मैं भी यह बात करता हूं कि इस प्रकार की कॉल के लिए टीसीपी कनेक्शन वास्तव में अनुकूलित नहीं किया गया है और अन्य सभी दृष्टिकोण बहुत तेज होना चाहिए।

6

मुझे यह वही समस्या थी, HttpWebRequest.Abort() पर कॉल जोड़ने से यह ठीक लग रहा था।

+0

धन्यवाद! मेरी समस्या को ठीक करने में मेरी मदद की। याद रखें: हमेशा अपना बंद करें कनेक्शन ठीक से;) – pila

0

को ध्यान में रखना पहली बात, यूआरआई, मानकों और हेडर की समीक्षा करने के लिए भेजा जा रहा है विशेष रूप से:

  • सुरक्षित अक्षर। URI के आधार पर आरक्षित वर्ण भेजें समस्याओं ! * ' () ; : @ & = + $ ,/? # []
  • यूआरआई लंबाई ला सकता है: आप 2000 वर्ण
  • लंबाई के शीर्षलेख अधिक नहीं होनी चाहिए: अधिकांश वेब सर्वर हेडर वे स्वीकार करते हैं की सीमा आकार है। उदाहरण के लिए अपाचे डिफ़ॉल्ट सीमा 8KB है।

ध्यान रखें कि यदि आप लंबे समय से डेटा भेजना चाहते हैं तो संदेश के शरीर में भेजने की सिफारिश की जाती है।

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