2011-08-08 10 views
11

मुझे वेब क्लाइंट के साथ समस्या है।वेब क्लाइंट बहुत धीमा है

यह बहुत धीमी है। एक वेबसाइट से डाउनलोड करने में लगभग 3-5 सेकंड लगते हैं। मेरे पास कोई नेटवर्क समस्या नहीं है।

यह मेरा संशोधित वेब क्लाइंट है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace StatusChecker 
{ 
    class WebClientEx: WebClient 
    { 
     public CookieContainer CookieContainer { get; private set; } 

     public WebClientEx() 
     { 
      CookieContainer = new CookieContainer(); 

      ServicePointManager.Expect100Continue = false; 
      Encoding = System.Text.Encoding.UTF8; 

      WebRequest.DefaultWebProxy = null; 
      Proxy = null; 
     } 

     public void ClearCookies() 
     { 
      CookieContainer = new CookieContainer(); 
     } 

     protected override WebRequest GetWebRequest(Uri address) 
     { 

      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = CookieContainer; 
      } 
      return request; 
     } 
    } 
} 

अद्यतन: Wireshark में मैंने देखा कि एक DownladString भेजने और कुछ हजारों पैकेट प्राप्त कर रहा है।

+4

WebClient विशेष रूप से धीमी गति से नहीं है, समस्या कहीं और होना चाहिए ... शायद आप जिस वेबसाइट से डाउनलोड कर रहे हैं वह धीमी है? –

+1

आपको वायरशर्क जैसे ट्रैफिक लॉगर का उपयोग यह निर्धारित करने के लिए करना चाहिए कि देरी वास्तव में एकल अनुरोध और प्रतिक्रिया फ्रेम (नेटवर्क/सर्वर मंदी के कारण) के बीच है या हो रहा है क्योंकि क्लाइंट कोड गलत व्यवहार कर रहा है और बहुत से अनुरोध या कुछ ऐसे तर्क भेज रहा है त्रुटि। –

+0

प्रक्रिया को 'गर्म करने' के लिए लूप में कई डाउनलोड निष्पादित करें (उदाहरण के लिए असेंबली के भार को समाप्त करें)। –

उत्तर

30

वहाँ हाथ यहाँ (है कि मैं भी पहले अपने खुद के कार्यक्रमों में देखा है) पर दो मुद्दों हो सकता है:

  • पहले अनुरोध एक असामान्य रूप से लंबे समय लेता है: इसका कारण यह है WebRequest डिफ़ॉल्ट रूप से होता है पहली बार प्रॉक्सी सेटिंग्स का पता लगाता है और लोड करता है, जो काफी समय ले सकता है। इसे रोकने के लिए, बस null करने के लिए प्रॉक्सी संपत्ति (WebRequest.Proxy) की स्थापना की और यह जांच
  • आप एक बार में अधिक से अधिक 2 आइटम डाउनलोड नहीं कर सकता (आप सीधे इंटरनेट का उपयोग कर सकते हैं प्रदान की गई) की कोई आवश्यकता नहीं: डिफ़ॉल्ट रूप से, आप केवल 2 एक साथ HTTP कनेक्शन खोल सकते हैं। इसे बदलने के लिए, ServicePointManager.DefaultConnectionLimit को कुछ बड़ा सेट करें। मैं आमतौर पर इसे int.MaxValue पर सेट करता हूं (बस सुनिश्चित करें कि आप मेजबान को 1,000,000 कनेक्शन के साथ स्पैम नहीं करते हैं)।
+1

यह मेरे मामले में सही जवाब नहीं है। आप देख सकते हैं कि मैं पहले से ही प्रॉक्सी को शून्य पर सेट करता हूं। और मैं एक ही समय में 2 आइटम डाउनलोड नहीं कर रहा हूं। साथ ही साथ मेरे पोस्ट में जोड़ा गया है कि वायरशर्क में मैं देख सकता हूं कि मेरा ऐप प्रति डाउनलोड स्ट्रिंग के हजारों पैकेट भेजता है और प्राप्त करता है। स्ट्रिंग google.com जैसी सरल वेबसाइट है। – Hooch

+0

यदि यह असामान्य रूप से धीमा नहीं है (अर्थात् कनेक्शन के पास रखरखाव बंद होने के साथ एक ही गति के बारे में है), तो यह काम कर रहा है जैसा कि यह करना चाहिए। हैंडशेक निष्पादित करने में समय लगता है, अनुरोध करें, सर्वर को प्रतिक्रिया बनाने के लिए प्रतीक्षा करें, फिर प्रतिक्रिया को पढ़ने के लिए। – foxy

+0

क्या आप मुझे जीवित रखने वाले लोगों के बारे में कुछ और बता सकते हैं? और मेरा ऐप हजारों पैकेट क्यों भेजता है? – Hooch

0

शायद यह किसी की मदद करेगा। कुछ वेब सेवाएं संपीड़न (gzip या अन्य) का समर्थन करती हैं। तो आप अपने अनुरोधों के लिए स्वीकृति-एन्कोडिंग हेडर जोड़ सकते हैं और फिर वेब क्लाइंट इंस्टेंस के लिए automatic decompression सक्षम कर सकते हैं। क्रोम इस तरह से काम करता है।

0

वहाँ कुछ ही विकल्प अगर यह प्रारंभिक प्रॉक्सी सेटिंग्स से संबंधित है की जाँच की जा रही हैं:

  1. इंटरनेट एक्सप्लोरर में स्वचालित प्रॉक्सी पता लगाने सेटिंग्स अक्षम
  2. सेट अशक्त करने के लिए प्रॉक्सी:

    WebClient.Proxy = शून्य

  3. एप्लिकेशन स्टार्टअप पर डिफ़ॉल्ट वेबप्रैक्सी को शून्य पर सेट करें:

    WebRequest.DefaultWebProxy = शून्य;

बड़े नेट कोड के बजाय अशक्त के लिए सेटिंग में, आप इस लिखने के लिए इस्तेमाल किया है (लेकिन अशक्त अब बेहतर रहेगा):

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy(); 
संबंधित मुद्दे