मैं WebClient में 2 कनेक्शन सीमा को प्रोग्रामेटिक रूप से कैसे निकाल सकता हूं


88

उन "ठीक" RFC को प्रत्येक RFC- ग्राहक से आज्ञा मिलती है कि वे प्रति होस्ट 2 से अधिक कनेक्शन का उपयोग न करने से सावधान रहें ...

Microsoft ने इसे WebClient में लागू किया। मुझे पता है कि इसे बंद किया जा सकता है

app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
 <system.net> 
  <connectionManagement> 
   <add address="*" maxconnection="100" /> 
  </connectionManagement> 
 </system.net> 
</configuration> 

( http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 पर पाया गया )

लेकिन मैं इसे प्रोग्रामेटिक रूप से कैसे कर सकता हूं?

Accordin से http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

"DefaultConnectionLimit संपत्ति को बदलने से मौजूदा ServicePoint ऑब्जेक्ट्स पर कोई प्रभाव नहीं पड़ता है; यह केवल ServicePoint ऑब्जेक्ट्स को प्रभावित करता है, जो परिवर्तन के बाद प्रारंभ हो जाते हैं। यदि इस संपत्ति का मूल्य सीधे या कॉन्फ़िगरेशन के माध्यम से सेट नहीं किया गया है, तो मान निरंतर DefaultPersistentConnectionLimit में चूक जाता है।"

जब मैं WebClient को संस्थापित करूं, तो सीमा को कॉन्फ़िगर करना सबसे अच्छा होगा, लेकिन इस दुविधा को केवल मेरे प्रोग्राम की शुरुआत में प्रोग्रामेटिक रूप से हटाना भी ठीक रहेगा।

मैं जिस सर्वर तक पहुंचता हूं वह इंटरनेट में एक नियमित वेबसर्वर नहीं है, लेकिन मेरे नियंत्रण में और स्थानीय लेन में है। मैं एपीआई-कॉल करना चाहता हूं, लेकिन मैं वेबसर्विस या रीमोटिंग का उपयोग नहीं करता हूं


15
यह वास्तव में एक मानक नहीं है। RFC "अनुशंसा करता है" कि आप ग्राहकों को दो कनेक्शनों तक सीमित करें, लेकिन यह वास्तव में एक आवश्यकता नहीं है। संभावना से अधिक, पोस्टर को एक बार में 2 से अधिक आइटम डाउनलोड करने की आवश्यकता होती है।
एरिक फनकेनबसच

12
मैं अपने स्वयं के सर्वर पर एक एपीआई का उपयोग करता हूं। मैं इंटरनेट में मेजबानों को नुकसान नहीं पहुंचाना चाहता।
ईसाई

12
मैंने लोड परीक्षण उपकरण बनाने के लिए कनेक्शन सीमा बढ़ा दी है। 2 खदान कनेक्शन के साथ परीक्षण लोड करना वास्तव में कठिन है। मुझे यकीन है कि कई कनेक्शनों का उपयोग करने के लिए गैर-ब्राउज़िंग कारणों के बहुत सारे हैं।
स्कॉट्स

1
BTW, ऊपर का विन्यास सभी .Net नियंत्रित कनेक्शनों को प्रभावित करेगा, न कि केवल वेबक्लीयर।
स्कॉट

2
दो से ज्यादा क्यों? आइए इस प्रश्न पर ध्यान दें: मैं एक ही समय में अतुल्यकालिक रूप से एक सर्वर पर दो से अधिक अनुरोध क्यों जारी नहीं कर सकता हूं? 2 सिर्फ एक सीमा है।
Csaba Toth

जवाबों:


50

यहाँ और कहीं और से कुछ सुझावों के साथ मैं अपने आवेदन में इसे ठीक करने में कामयाब रहा जिसका उपयोग मैं WebClient वर्ग को ओवरराइड करके कर रहा था:

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}

28
IMHO जो System.Net.ServicePointManager.DefaultConnectionLimitएक बेहतर समाधान है, जैसा कि यह नहीं मान सकते हैं कि WebRequestयह एक है HttpWebRequest, उदाहरण के लिए, यह एक हो सकता है FileRequest
डेनिस

120

उन लोगों के लिए:

System.Net.ServicePointManager.DefaultConnectionLimit = x (जहाँ x आपके वांछित कनेक्शन की संख्या है)

अतिरिक्त संदर्भ के लिए कोई ज़रूरत नहीं है

बस यह सुनिश्चित करें कि यह सेवा बिंदु कहलाता है, जैसा कि पोस्ट में ऊपर बताया गया है।


तो क्या इसे ग्लोबल में application_start में जोड़ा जा सकता है? इसलिए यह किए गए सभी कनेक्शनों को प्रभावित करता है?
TheAlbear

System.Net.ServicePointManager.DefaultConnectionLimit = x कैसे और कहाँ जोड़ें?
अरुल सिद्धन

अजीब तरह से, DefaultConnectionLimit (F12 का उपयोग करते हुए) के लिए कोड टिप्पणी कहती है कि इसका डिफ़ॉल्ट Int32.MaxValue है। हालांकि डिबग निरीक्षण द्वारा यह दावा किया गया 2 है।
क्रोकेक

7

यह समाधान आपको किसी भी समय कनेक्शन सीमा बदलने की अनुमति देता है :

private static void ConfigureServicePoint(Uri uri)
{
    var servicePoint = ServicePointManager.FindServicePoint(uri);

    // Increase the number of TCP connections from the default (2)
    servicePoint.ConnectionLimit = 40;
}

1 समय किसी को भी इस कॉल FindServicePoint , एक ServicePoint उदाहरण बन जाता है और एक WeakReference अंदर यह करने के लिए पर पकड़ बनाई गई है ServicePointManager । उसी उरई के लिए प्रबंधक से बाद के अनुरोध उसी उदाहरण को वापस करते हैं। यदि कनेक्शन का उपयोग नहीं किया जाता है, तो GC इसे साफ करता है।


1
FindServicePoint के साथ एकमात्र समस्या यह है कि यह आपको एक ServicePoint को वापस सौंपता है, लेकिन आपको नहीं पता कि यह वही ServicePoint होगा जो आपके क्लाइंट को मिलता है।
jeffa00

2
यह एक "समस्या" नहीं है, यह नौकरी का सिर्फ एक सामान्य हिस्सा है। सभी समाधानों के साथ, आपको उस परीक्षण का एक तरीका खोजना होगा। मेरा तरीका सेटिंग को .config में "1" पर सेट करना था, भयानक प्रदर्शन का निरीक्षण करना, और इसे (यहाँ पर) कोड में सेट करना, बेहतर प्रदर्शन को देखते हुए।
अबेकस

1
ServicePointके बाद (अपनी सेटिंग सहित) खो दिया हैMaxIdleTime
कॉलिन Breame

5

यदि आपको अपने WebClient द्वारा उपयोग की जा रही ServicePoint ऑब्जेक्ट मिल जाती है, तो आप इसकी कनेक्शन सीमा बदल सकते हैं। HttpWebRequest ऑब्जेक्ट का उपयोग करने के लिए बनाए गए एक को पुनः प्राप्त करने के लिए एक एक्सेसर होता है, इसलिए आप इसे इस तरह से कर सकते हैं। यदि आप भाग्यशाली हैं, तो आपके सभी अनुरोध एक ही ServicePoint को साझा करना समाप्त कर सकते हैं, इसलिए आपको केवल एक बार करना होगा।

मुझे सीमा बदलने का कोई वैश्विक तरीका नहीं पता है। यदि आपने DefaultConnectionLimit को जल्दी से निष्पादन में बदल दिया है, तो आप शायद ठीक हो जाएंगे।

वैकल्पिक रूप से, आप बस कनेक्शन सीमा के साथ रह सकते हैं, क्योंकि अधिकांश सर्वर सॉफ्टवेयर आपको वैसे भी थ्रॉटल करने जा रहे हैं। :)


यह सर्वर मुझे थ्रॉटल नहीं करेगा (वास्तव में, यह होगा, लेकिन एक अलग तरीके से) क्योंकि यह पूरी तरह से मेरे नियंत्रण में है
ईसाई

1
एक सर्वर बहुत सारे कनेक्शन के साथ थ्रॉटल कर सकता है, लेकिन मैंने अनुभव नहीं किया है कि एक छोटे सर्वर (एक सीमित वीएम में होस्ट) के साथ भी। क्लाइंट की ओर से सीमा 2 ने मुझे दूसरी ओर वापस आयोजित किया। सीमा बढ़ने से स्थिति स्वतंत्र हुई।
Csaba Toth

1
मुझे यह भी संदेह है कि आज का कोई भी ब्राउजर HTTP 1.1 RFC की सीमा 2. का पालन करेगा
Csaba Toth

4

हमारे पास App.Config में कॉन्फ़िगरेशन के उपरोक्त टुकड़े के बारे में एक स्थिति है

किसी CONSOLE एप्लिकेशन में मान्य होने के लिए, हमने System.Configuration reference dll जोड़ा। संदर्भ के बिना, उपरोक्त बेकार था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.