2009-05-07 11 views
26

का उपयोग करते समय सर्वर पर डब्लूसीएफ समवर्ती अनुरोध सर्वर पर पिलिंग करते हैं मेरे पास एक डब्ल्यूसीएफ क्लाइंट/सर्वर ऐप है जो 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"/> सेटिंग को यह (दिखाई देने) रोकने के लिए बनाया गया है।
  • अनुरोध बी भेजा जाता है और तुरंत जबकि अनुरोध सी (यह दुर्लभ है)

यहाँ Fiddler से एक समय समस्या का प्रदर्शन है 20 सेकंड पूरा करता है, जब तक वापस आयोजित किया जाता है एक प्रतिक्रिया प्राप्त करता है,: (बड़ा संस्करण के लिए क्लिक करें)

आप देख सकते हैं, अनुरोध सब सर्वर पर समर्थित किया जा रहा है। एक बार 20-सेकंड का अनुरोध पूरा हो जाने पर, प्रतिक्रियाएं सभी बाढ़ आती हैं, लेकिन ध्यान दें कि कुछ अनुरोध हैं जो नहीं हो रहे हैं ...

तो, प्रश्न:

  • बिल्ली क्या यहाँ चल रहा है? NetTcpBinding का उपयोग करके यह ठीक काम क्यों करता है और WSHttpBinding का उपयोग करके काम नहीं करता है?
  • असंगत व्यवहार क्यों?
  • इसे ठीक करने के लिए मैं क्या कर सकता हूं?

नोट्स:

  • उसे सर्वर पर ताला लगा नहीं है। मैंने ब्रेकपॉइंट्स सेट किए हैं और !syncblk का उपयोग किया है और यह लगातार रिपोर्ट करता है कि कोई ताला नहीं है।
  • यह मेरी सूत्रण (NetTcpBinding अन्यथा काम करना चाहिए नहीं) नहीं
  • मैं सर्वर के app.config में <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" /> सेट है
  • 20 सेकंड कॉल सिर्फ एक टाइमर पर इंतज़ार कर रहा है, यह CPU या डिस्क से हराने नहीं कर रहा है या नेटवर्क
  • मैं ऐसे समाधान को पसंद करूंगा जिसमें एसिंक्रोनस कॉल का उपयोग करने के लिए एप्लिकेशन को पुन: आर्किटेक्ट करने में शामिल न हो ... यह विरासत कोड का एक बड़ा समूह है और मैं वास्तव में उन चीज़ों के साथ गड़बड़ नहीं करना चाहता हूं जो मैं नहीं करता हूं ' t समझ।
+0

+1 प्रश्न के उत्कृष्ट लेआउट। –

+1

क्या आपने कभी इस मुद्दे को हल किया है? यदि हां, तो आपने इसे कैसे हल किया? – DivisionByZorro

+0

हमारे अंतिम "समाधान" का वर्णन करने वाला एक स्व-उत्तर जोड़ा गया –

उत्तर

2

[स्व जवाब अन्य उपयोगकर्ताओं को दिखाने के लिए क्या हमारे अंतिम समाधान था]

अंत में, मैं कभी नहीं इस का समाधान करने में कामयाब रहे।
हमारा अंतिम समाधान हमारे ऐप को WSHttpBinding से और NetTcpBinding पर उत्पादन में स्विच करना था - हम प्रदर्शन कारणों से वैसे भी ऐसा करने की योजना बना रहे थे।

हालांकि यह दुर्भाग्यपूर्ण है, क्योंकि यह WSHttpBinding पर एक काला निशान छोड़ देता है जो कि हो सकता है या नहीं। तो क्या कभी किसी ने एक समाधान है जो WSHttpBinding खुदाई शामिल नहीं करता है के साथ आ रहा है, मुझे पता है के बारे में यह

+1

पर सेट किया है, मुझे लगता है कि आपको वास्तव में स्वयं जवाब नहीं देना चाहिए हमारे पास कोई जवाब नहीं है। क्या आप कनेक्ट.microsoft.com पर बग पोस्ट करने का प्रयास कर रहे हैं? – Shrike

+0

अब जब मैंने चीजें कैसे काम की हैं, तो मुझे कुछ और पता चला है, मुझे लगता है कि यह थ्रेडपूल को ओवरलोड करने से संबंधित हो सकता है। यदि आप थ्रेडपूल पर लंबे समय तक चलने वाले संचालन कतारबद्ध करते हैं, तो आपको ऐसा व्यवहार मिलता है जो लगभग –

+0

जैसा दिखता है। मुझे WSHttp बाइंडिंग के साथ बिल्कुल वही समस्या है और मुझे नहीं लगता कि यह ओवरलोडेड थ्रेड पूल के कारण है। मैंने NetTcp बाइंडिंग का उपयोग किया और यह अचानक पूरी तरह से काम करता है। मैं किसी अन्य सर्वर से समानांतर में एक और कॉल प्रदर्शित करने की कोशिश करते समय, इसे पहली बार सेवा में अपनी पहली कॉल करके, जिसे आप सोते हैं, प्राप्त कर सकते हैं। मेरी सेवा व्यवहार और सेवा थ्रॉटलिंग पर सेट किए जाने के बावजूद सेवा से संपर्क करने के लिए और कुछ भी नहीं संपर्क कर सकता है। – Mike737

10

डब्ल्यूसीएफ (एक नेट या विंडोज चीज) के बाहर कुछ थ्रॉटल है जो केवल अधिकतम दो एक साथ आउटबाउंड HTTP कनेक्शन देने के लिए डिफ़ॉल्ट है। दुर्भाग्यवश मुझे अपने जीवन के लिए चीज़ का नाम याद नहीं है (और जो आपने ऐप.कॉन्फिग में रखा होगा या अपने ऐप को ओवरराइड करने के लिए)। यह देखते हुए कि आप क्लाइंट को छोड़कर अनुरोध नहीं देख रहे हैं, और यह केवल HTTP है, मुझे लगता है कि आप "उस चीज़" को मार रहे हैं। मैं इसके नाम की तलाश रखूंगा।

अद्यतन: मिला यह - ग्राहक पर इस कोशिश (लेकिन '2' एक बड़ी संख्या के लिए बदल):

<configuration> 
    <system.net> 
    <connectionManagement> 
     <add address = "*" maxconnection = "2" /> 
    </connectionManagement> 
    </system.net> 
</configuration> 
+0

दुर्भाग्य से इसने इसे हल नहीं किया ... यह कुछ हद तक व्यवहार बदल गया, लेकिन अब सभी अनुरोध सर्वर पर बैक अप लगते हैं –

+0

मेरे प्रश्न को टाइमलाइन ग्राफ से अपडेट किया गया फिडलर जो उम्मीद कर सकते हैं –

0

मैं भूल गया - यह आदेश देने जा सकता है? मुझे लगता है कि http पर शायद आरएम ऑर्डर को सुरक्षित रखता है लेकिन शायद टीसीपी सत्र नहीं (जब तक आप स्पष्ट रूप से इसका अनुरोध नहीं करते)? क्या सेवा अनुबंध पर कोई विशेषता है जो आदेशित/अनियमित सत्रों (मैं भूल जाता हूं) का वर्णन करता हूं।

+0

वहाँ <विश्वसनीय सत्र> है जिसमें ऑर्डर किया गया विशेषता है ... मैंने इसे <विश्वसनीय सत्र आदेश = "झूठा" सक्षम = "सत्य" /> –

1

यदि आप BasicHttp बाइंडिंग में बदलते हैं, तो यह काम करता है?

ऐसा है, ऐसा लगता है कि यह this is your problem, सत्र थ्रॉटलिंग, कुछ मुझे गधे में थोड़ा सा लगता है।

1

प्रति कॉल सेवाओं पर ConcurrencyMode.Multiple का उपयोग कर समवर्ती कॉल की अनुमति पर विचार अच्छा लगेगा।

4

हमने आईआईएस/एएसपी.नेट में होस्ट की गई JSON सेवा के साथ बिल्कुल वही लक्षण देखा।

मूल कारण एएसपी.NET अनुरोधों को सिंक्रनाइज़ करने के कारण समाप्त हुआ - डब्ल्यूसीएफ नहीं। समवर्ती डब्ल्यूसीएफ विधियों को प्राप्त करने के लिए हमें सत्र स्थिति (एप्लिकेशन स्तर पर) को अक्षम करना पड़ा।

Web.config: <system.web> <sessionState mode="Off" /> </system.web>

कृपया ध्यान दें हमारी सेवा का उपयोग करता है WebHttpBinding, wsHttpBinding नहीं। तो, मुझे यकीन नहीं है कि यह ओरियन की समस्या को हल करता है।

2

मुझे लगता है कि आप प्रोटोकॉल सीमा तक नहीं पहुंच और इसके आसपास काम करने के लिए आप क्लाइंट मशीन पर मानक सेटिंग्स को संशोधित करने की जरूरत है:

http://support.microsoft.com/kb/183110

http://support.microsoft.com/kb/282402

मैं WSHttpBinding WinInet सेटिंग्स का उपयोग करता लगता है कि जब जारी करने वाले अनुरोध

+0

ऐसा लगता है, लेकिन मेरे पास मूल कोड खोने के बाद से काफी समय है। हालांकि धन्यवाद! –

0

सुनिश्चित नहीं है लेकिन कभी-कभी चांदी के आवेदन से समवर्ती कॉल के साथ समस्या ब्राउज़र कनेक्शन प्रबंधन से संबंधित होती है। मेरे लिए यहाँ समाधान descrive के रूप में डाल करने के लिए है कि हमारे App.xaml.cs, Application_Startup विधि में था: http://weblogs.asp.net/olakarlsson/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 
संबंधित मुद्दे