का उपयोग करते समय सर्वर पर डब्लूसीएफ समवर्ती अनुरोध सर्वर पर पिलिंग करते हैं मेरे पास एक डब्ल्यूसीएफ क्लाइंट/सर्वर ऐप है जो WSHttp बाइंडिंग का उपयोग कर HTTP पर संचार कर रहा है।WCHttp बाइंडिंग
सर्वर सेटअप: मानक डब्ल्यूसीएफ ServiceHost
का उपयोग करके स्वयं-होस्टिंग। मेरे वास्तविक सेवा वर्ग जिम्मेदार ठहराया है के रूप में:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false)]
क्लाइंट सेटअप: (। ऐसे समय के रूप में सर्वर पूरी तरह से जवाब दे दिया है जब तक proxy.call_server_method
ब्लॉक) तुल्यकालिक सेवा कॉल का उपयोग कर एक दृश्य स्टूडियो उत्पन्न ग्राहक प्रॉक्सी का प्रयोग
परिदृश्य: मेरे पास एक विशेष विधि कॉल है जो सर्वर पर निष्पादित करने में 20 सेकंड लगती है। ग्राहक इस विधि को एक अलग थ्रेड में कॉल करता है, इसलिए इसे नहीं रखा जा रहा है, और ConcurrencyMode.Multiple
का अर्थ है डब्ल्यूसीएफ को सर्वर पर एक अलग थ्रेड में इसे निष्पादित करना चाहिए।
यह सिद्धांत इस तथ्य से समर्थित है कि जब मैं अपने ऐप को NetTcpBinding
का उपयोग करने के लिए कॉन्फ़िगर करता हूं, तो सब ठीक काम करता है।
समस्या:
मैं WSHttpBinding
उपयोग करने के लिए ऐप्लिकेशन कॉन्फ़िगर है, तो इस लंबे विधि कॉल http अनुरोध करने के लिए 'बैक अप' का कारण बनता है। मैंने इस व्यवहार को मेरे लॉग का निरीक्षण करने और फिडलर का उपयोग करके HTTP अनुरोधों को डीबग करने से सत्यापित किया है।
उदाहरण:
- ग्राहक
- क्लाइंट शुरू की अनुरोध बी और सी अग्रभूमि धागा
- अनुरोध बी और सी पर सर्वर है, जो नहीं करता है के लिए भेजा करने के लिए एक पृष्ठभूमि धागे पर 20 सेकंड लंबा अनुरोध शुरू की 'टी उन्हें प्रोसेस जब तक यह 20 सेकंड लंबा अनुरोध
लेकिन कभी कभी के साथ किया जाता है:
- अनुरोध बी और सी 20-सेकंड अनुरोध वापस आने तक यह (वे फिडलर में भी दिखाई नहीं देते) नहीं भेजे जाते हैं (यह दुर्लभ है)।
- नोट: क्लाइंट के app.config में
<add address="*" maxconnection="100"/>
सेटिंग को यह (दिखाई देने) रोकने के लिए बनाया गया है।
- नोट: क्लाइंट के app.config में
- अनुरोध बी भेजा जाता है और तुरंत जबकि अनुरोध सी (यह दुर्लभ है)
यहाँ Fiddler से एक समय समस्या का प्रदर्शन है 20 सेकंड पूरा करता है, जब तक वापस आयोजित किया जाता है एक प्रतिक्रिया प्राप्त करता है,: (बड़ा संस्करण के लिए क्लिक करें)
आप देख सकते हैं, अनुरोध सब सर्वर पर समर्थित किया जा रहा है। एक बार 20-सेकंड का अनुरोध पूरा हो जाने पर, प्रतिक्रियाएं सभी बाढ़ आती हैं, लेकिन ध्यान दें कि कुछ अनुरोध हैं जो नहीं हो रहे हैं ...
तो, प्रश्न:
- बिल्ली क्या यहाँ चल रहा है?
NetTcpBinding
का उपयोग करके यह ठीक काम क्यों करता है औरWSHttpBinding
का उपयोग करके काम नहीं करता है? - असंगत व्यवहार क्यों?
- इसे ठीक करने के लिए मैं क्या कर सकता हूं?
नोट्स:
- उसे सर्वर पर ताला लगा नहीं है। मैंने ब्रेकपॉइंट्स सेट किए हैं और
!syncblk
का उपयोग किया है और यह लगातार रिपोर्ट करता है कि कोई ताला नहीं है। - यह मेरी सूत्रण (NetTcpBinding अन्यथा काम करना चाहिए नहीं) नहीं
- मैं सर्वर के app.config में
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
सेट है - 20 सेकंड कॉल सिर्फ एक टाइमर पर इंतज़ार कर रहा है, यह CPU या डिस्क से हराने नहीं कर रहा है या नेटवर्क
- मैं ऐसे समाधान को पसंद करूंगा जिसमें एसिंक्रोनस कॉल का उपयोग करने के लिए एप्लिकेशन को पुन: आर्किटेक्ट करने में शामिल न हो ... यह विरासत कोड का एक बड़ा समूह है और मैं वास्तव में उन चीज़ों के साथ गड़बड़ नहीं करना चाहता हूं जो मैं नहीं करता हूं ' t समझ।
+1 प्रश्न के उत्कृष्ट लेआउट। –
क्या आपने कभी इस मुद्दे को हल किया है? यदि हां, तो आपने इसे कैसे हल किया? – DivisionByZorro
हमारे अंतिम "समाधान" का वर्णन करने वाला एक स्व-उत्तर जोड़ा गया –