2010-02-11 8 views
10

मैं सोच रहा था कि क्या आप मेरी एक बग के साथ मेरी मदद कर सकते हैं। मेरे पास एक HTTP प्रबंधक है जो मैंने बनाया है जो मुझे वेबसाइटों से डेटा पोस्ट करने/प्राप्त करने से निपटने में मदद करता है। हाल ही में जब तक मैं दोनों के मिश्रण का उपयोग करने की कोशिश कर रहा हूं तब तक यह ठीक काम करता है। पहला पाश राउंड सबकुछ काम करता है, दूसरे लूप पर यह HttpWebRequest.GetRequestStream() पर लटकता है। मैंने नेट पर पढ़ा है और कोई वास्तविक समाधान नहीं मिला है। नीचे प्राप्त कर रहा है/प्राप्त करने के लिए codeblocks हैं:क्या किसी को पता है कि मुझे एक HttpWebRequest टाइमआउट क्यों प्राप्त होता है?

ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] buffer = encoding.GetBytes(_PostData); 

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl); 
_HttpWebRequest.Credentials = _Credentials; 
_HttpWebRequest.Method = _RequestType.ToString(); 
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
_HttpWebRequest.ContentLength = buffer.Length; 
_HttpWebRequest.UserAgent = userAgent; 
_HttpWebRequest.CookieContainer = _CookieContainer; 
_HttpWebRequest.KeepAlive = false; 
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect; 
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 
_HttpWebRequest.ServicePoint.Expect100Continue = false; 

if (_RequestType.Equals(RequestTypes.POST)) 
{ 
    // Write POST 
Stream reqStream = _HttpWebRequest.GetRequestStream(); 
{ 
    reqStream.Write(buffer, 0, buffer.Length); 
    reqStream.Flush(); 
    reqStream.Close(); 
    } 
} 

और प्रतिक्रिया:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse(); 
{ 
    Stream responseStream = httpWebResponse.GetResponseStream(); 
    { 
    if (_UseGzip) 
    { 
     if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 
    } 

    if (responseStream != null) 
    { 
     StreamReader streamReader = new StreamReader(responseStream); 
     { 
     try 
     { 
      _PageContent = streamReader.ReadToEnd(); 
     } 
     finally 
     { 
      streamReader.Close(); 
      responseStream.Close(); 
      httpWebResponse.Close(); 
     } 
     } 
    } 
    else 
    { 
     _PageContent = string.Empty; 
    } 
    } 
} 
_HttpWebRequest.Abort(); 

किसी को भी क्यों मेरे कोड व्यतीत कर रहा है के लिए किसी भी खामियां देख सकते हैं? सभी धाराएं बंद हो रही हैं, मैंने 100 से अधिक अनुमत कनेक्शन सेट किए हैं, मुझे समझ में नहीं आता कि यह क्यों टूट रहा है।

+0

आप क्या डेटा वास्तव में भेजा जा रहा है देखने के लिए Wireshark की तरह कुछ उपयोग करने की कोशिश की है? – Foole

+0

जब आप कहते हैं कि कोड पहली बार काम करता है लेकिन दूसरे पर रोकता है, तो आप संबंधित अनुरोधों के दौरान किस http विधियों का उपयोग करते हैं? –

+0

कोड एक पोस्ट पर लटकता है, जीईटी ठीक काम कर रहा प्रतीत होता है। जब मैं burp प्रॉक्सी के माध्यम से कोड चलाता हूं तो यह किसी कारण से ठीक काम करता है? हो सकता है कि प्रॉक्सी मेरे कुछ शीर्षकों की मरम्मत कर रही है क्योंकि मुझे समझ में नहीं आता कि इसे कैसे फर्क पड़ता है। –

उत्तर

11

इस तथ्य के कारण हो सकता है कि आप अपने WebResponse या धाराओं या StreamReaders के निपटान नहीं कर रहे हैं:

var request = WebRequest.Create(...); 
using (var response = request.GetResponse()) 
{ 
    using (var responseStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(responseStream)) 
     { 
      // use the reader 
     } 
    } 
} 
+0

मैं अनुरोध छोड़ रहा हूं (कोई निपटान विधि उपलब्ध नहीं है), और सभी उपलब्ध धाराओं को बंद कर रहा है। मैंने सभी ऑब्जेक्ट्स को शून्य करने के लिए सेट करने की कोशिश की है और फिर प्रत्येक अनुरोध के अंत में जीसी को निपटाने का प्रयास किया है और इससे कोई प्रभाव नहीं पड़ा है। –

+2

@ पॉल: आपको 'StreamReader' का निपटान करने की भी आवश्यकता है, क्योंकि यह' IDISposable 'लागू करता है। 'स्ट्रीम' के साथ, जिसे आप बंद नहीं कर रहे हैं अगर कोई अपवाद फेंक दिया गया है। यही है कि 'उपयोग' ब्लॉक आपके लिए करता है। यह सुनिश्चित करता है कि इसका पैरामीटर डिस्पोज़ किया गया हो, इससे कोई फर्क नहीं पड़ता। जैसे ही मैं सुनता हूं कि कोड बाद के प्रयासों में विफल रहता है, मुझे आश्चर्य है, "_previous_ प्रयास पर उसने क्या किया _not_"। अक्सर, जवाब है, "कुछ निपटान नहीं किया गया"। –

2

मैं एक ही समस्या थी। मैंने ब्लॉकों का उपयोग करके इन सभी धाराओं और HttpWebResponse को सही ढंग से बंद कर दिया (निपटान)। समस्या तब भी बनी रही जब मैंने स्पैम किए गए अनुरोधों को थ्रेडएबॉर्ट अपवादों द्वारा निरस्त किया। आखिरकार यह ThweAbortException होने पर myWebRequest.Abort() को कॉल करने में मदद मिली! उम्मीद है की यह मदद करेगा।

0

मुझे लगता है कि आप का उपयोग करें:

मैनुअल विसंपीड़न दृष्टिकोण के साथ साथ
HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 

:

 if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 

कोशिश नहीं था अगर यह वास्तव में मायने रखती है, लेकिन मैं केवल मैनुअल दृष्टिकोण और इसी तरह के कोड में उपयोग करते हैं, और यह ठीक काम करता है। असल में मुझे समस्या लटक रही है, लेकिन केवल एक डोमेन के साथ, गुणों के साथ प्रयोग करने से अंतर दिखाई देता है।

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

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

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