2009-06-21 8 views
10

मुझे HttpWebRequest के साथ कुछ बहुत अजीब व्यवहार मिल रहा है, मुझे उम्मीद है कि कोई मेरी मदद कर सकता है। मेरे पास एक कंसोल ऐप है जो लक्ष्य वेबसाइट की सामग्री को पुनर्प्राप्त करने के लिए HttpWebRequest ऑब्जेक्ट का उपयोग करके कुछ समेकन कार्य करता है। आवश्यकता की प्रकृति के कारण ऐप बहुप्रचारित है और 10 से 30 एक साथ कनेक्शन (मैं मूल्यों की एक श्रृंखला के साथ प्रयोग कर रहा हूं) के बीच कहीं भी बनाने का प्रयास करता हूं। इस प्रकार वास्तविक वेब अनुरोध संरचित है:Fiddler का उपयोग करते समय HttpWebRequest ऑब्जेक्ट का प्रदर्शन क्यों सुधारता है?

var req = (HttpWebRequest)WebRequest.Create(url); 
WebResponse resp = req.GetResponse(); 
Stream s = resp.GetResponseStream(); 
var sr = new StreamReader(s, Encoding.ASCII); 
string doc = sr.ReadToEnd(); 
sr.Close(); 
resp.Close(); 
return doc; 

वैसे भी, अजीब व्यवहार कि सामान्य परिस्थितियों में एप्लिकेशन प्रति मिनट लगभग 120 अनुरोधों को प्राप्त किया जाता है लेकिन अगर मैं फ़िडलर को खोलने इसके बारे में 600 विंडोज 7 का उपयोग करने के लिए कूदता है संसाधन मॉनीटर मैं तदनुसार नेटवर्क गतिविधि में वृद्धि देख सकता हूं। कंसोल प्रक्रिया के लिए टीसीपी कनेक्शन अब दूरस्थ सर्वर आईपी पते (अपेक्षित) के बजाय दूरस्थ पते को "आईपीवी 4 लूपबैक" के रूप में सूचीबद्ध करते हैं। मैंने मशीन द्वारा अनुमत एक साथ HTTP अनुरोधों की अधिकतम संख्या के बारे में आश्चर्यचकित किया लेकिन रजिस्ट्री में इसे बदलने से कोई फर्क नहीं पड़ता।

तो सवाल यह है; फिडलर चलाने के बारे में क्या है जो अचानक पांच गुना थ्रूपुट बढ़ाता है और मैं इसे किसी अन्य उपकरण को लॉन्च करने के बिना मशीन पर मूल रूप से कैसे प्राप्त कर सकता हूं?

धन्यवाद!

+0

मुझे एक ही समस्या है। लेकिन मेरे पास WinForm एप्लिकेशन है .. और मुझे यह नहीं पता कि Winform एप्लिकेशन के साथ इसे कैसे ठीक किया जाए .. –

उत्तर

14

ऐसा लगता है कि मैं अब (दोगुना करने के लिए है कि मैं फ़िडलर साथ वास्तव में खोलने हो रही थी) App.config में अधिकतम कनेक्शन की स्थापना करके प्रवाह प्राप्त करने के लिए सही अप कर लिया है:

<system.net> 
    <connectionManagement> 
    <add address="*" maxconnection="30" /> 
    </connectionManagement> 
</system.net> 

बहुत खुश नतीजतन, लेकिन अभी भी थोड़ा सा रहस्यमय है कि फिडलर ने क्यों नतीजों को नाटकीय रूप से बदल दिया।

+5

मेरा अनुमान यह होगा कि डिफ़ॉल्ट maxconnectionperproxy मान डिफ़ॉल्ट maxconnection मान से अधिक है। – EricLaw

+0

यह एक जीवन बचतकर्ता था। धन्यवाद! – Scrappydog

5

एक बात मैंने तुरंत देखी है कि आप ब्लॉक का उपयोग करके कार्यान्वित नहीं कर रहे हैं। यही कारण है कि एक अनियमितता पहलू यह है कि अनुरोधों की संख्या से गुणा किया जा सकता है कहते हैं, तो मैं आप को ठीक है कि सुझाव देते हैं:

var req = WebRequest.Create(url); 
using (WebResponse resp = req.GetResponse()) 
{ 
    using (Stream s = resp.GetResponseStream()) 
    { 
     using (var sr = new StreamReader(s, Encoding.ASCII)) 
     { 
      return sr.ReadToEnd(); 
     } 
    } 
} 

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

+0

अच्छा बिंदु जॉन, इसे बढ़ाने के लिए धन्यवाद। –

1

मुझे आपकी तरह की समस्या थी और मेरा संकल्प साझा करना चाहता था।

संक्षेप में, मेरे पास एक कंसोल प्रोग्राम था जो HTTP अनुरोध कर रहा था और 15 मिनट या उसके बाद, टाइमआउट के बाद। हालांकि, अगर मैंने फिडलर का इस्तेमाल किया तो मैंने कभी भी दिन के लिए दौड़ने के बाद भी टाइमआउट का अनुभव नहीं किया।

मैंने App.config में अधिकतम कनेक्शन संपत्ति सेट करने का प्रयास किया, लेकिन यह बिल्कुल मदद नहीं कर रहा था। मैं तब और प्रत्येक संदर्भ में HttpWebRequest, HttpWebResponse, और स्ट्रीम ऑब्जेक्ट्स को इन ऑब्जेक्ट्स को ब्लॉक का उपयोग करने के लिए डेटा पढ़ने/लिखने के लिए उपयोग करता था।

चाल चलने के लिए लगता है। मैं लगभग 24 घंटे बिना टाइमआउट के और बिना फिडलर के चल रहा हूं।

0

जिस तरह से आप क्वेरी करते हैं, प्रत्येक कॉल के लिए एक नया सत्र बनाने का कारण बनता है, जो कि ओवरडहेड है, यह हो सकता है कि फिडलर आपके प्रश्नों में सत्र जोड़ता है ....

निजी स्थिर CookieContainer _cookieContainer = नए CookieContainer कोशिश();

_httpWebRequest.CookieContainer = _cookieContainer; // cookiecontainer रीसाइक्लिंग के साथ

0

हमारे पास एक ही समस्या थी, अपने httpWebRequest.Pre प्रमाणीकरण को सही पर सेट करें।

आप 401 प्रतिक्रिया अब और नहीं करना चाहिए था, ताकि आप कम कनेक्शन खोल देंगे ...

0

मैं एक ही समस्या थी। मैंने इसे डाउनलोड किया: http://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html यह HttpWebRequest के प्रदर्शन का कारण था। यह TCPAckFrequency को संशोधित करता है और पूरी तरह से गड़बड़ कर देता है। मैंने इसे हटा दिया और अब यह काम करता है।

0

मेरे लिए, मैं request.ProtocolVersion = HttpVersion.Version10;

की स्थापना की गई थी इस लिए डिफ़ॉल्ट सेटिंग HttpVersion.Version11 है। जब मैं इसे डिफ़ॉल्ट पर वापस सेट करता हूं तो मेरे अनुरोध फिडलर के बिना बहुत तेज़ हो जाते हैं।

मुझे आशा है कि यह किसी और की मदद करेगी, इसे समझने के लिए मुझे सुबह भर ले लिया गया है!