c# - डब्ल्यूसीएफ लगभग 10 या तो कॉल(थ्रॉटलिंग) के बाद प्रतिक्रिया देना बंद कर देता है




wcf web-services (4)

मेरे पास एक डब्ल्यूसीएफ सेवा है और इसमें एक सेवा संदर्भ वाला एक एप्लिकेशन है, और एप्लिकेशन के साथ मेरे पास एक लूप है और प्रत्येक पुनरावृत्ति में यह इस डब्ल्यूसीएफ वेब-सेवा में किसी विधि को कॉल कर रहा है।

समस्या यह है कि लगभग 9 कॉल या उसके बाद, यह बस बंद हो जाता है ... और यदि आप वीएस के Pause बटन दबाते हैं, तो आप देखेंगे कि यह उस लाइन पर फंस गया है जहां यह कॉल करता है।

कुछ समय के लिए इंतजार करने के बाद, यह टाइमआउट अपवाद फेंक दिया गया है:

00: 00: 59.9970000 के बाद उत्तर के लिए प्रतीक्षा करते समय अनुरोध चैनल का समय समाप्त हो गया। बाध्यकारी पर SendTimeout मान का अनुरोध या वृद्धि करने के लिए कॉल को पास किए गए टाइमआउट मान को बढ़ाएं। इस ऑपरेशन को आवंटित समय लंबे समय तक का एक हिस्सा हो सकता है।

मैंने इस पर थोड़ा सा शोध किया, और कुछ समाधान पाए जो एप्लिकेशन में app.config को संपादित करने में शामिल थे, और यहां इसके अंश हैं:

<serviceBehaviors>
    <behavior name="ThrottlingIssue">
        <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
    </behavior>
</serviceBehaviors>

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
 maxArrayLength="2147483647" 
 maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 

फिर, जब मैं डिबगिंग रोकता हूं, कुछ मिनटों के बाद, एक त्रुटि संदेश मुझे बताता है कि एक विनाशकारी विफलता आई है।

मैं इस समस्या को कैसे ठीक करुं? जब मैं एक सामान्य वेब सेवा के साथ काम कर रहा था तो मेरे पास यह समस्या नहीं थी।

संदर्भ के लिए, यहां संपूर्ण app.config :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ThrottlingIssue">
                    <serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IDBInteractionGateway" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
                        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Message">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:28918/DBInteractionGateway.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDBInteractionGateway"
                contract="DBInteraction.IDBInteractionGateway" name="WSHttpBinding_IDBInteractionGateway">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

[अद्यतन] समाधान:

जाहिर है, प्रत्येक अनुरोध के बाद आपको कनेक्शन Close करना होगा ... अब मैं प्रत्येक अनुरोध के बाद कनेक्शन बंद कर रहा हूं और यह एक आकर्षण की तरह काम कर रहा है।

हालांकि मैं अभी भी समझ नहीं पा रहा हूं कि मेरे ऐप.कॉन्फिग में, मैंने अपने maxConcurrentCalls और maxConcurrentSessions को 500 पर सेट किया है, और फिर भी, मैं केवल 10 कर सकता हूं। किसी के पास इसका कोई जवाब है? (शायद मेरे ऊपर पोस्ट किए गए मेरे app.config में कुछ गड़बड़ है)

उपर्युक्त प्रश्न (अब धराशायी) का उत्तर इसलिए है क्योंकि मैं क्लाइंट app.config संपादित कर रहा था, सेवा कॉन्फ़िगरेशन फ़ाइल ( web.config ) नहीं


Clientervice.close () को कॉल करने से समस्या हल हो जाएगी।


अनुमत समवर्ती कनेक्शन की डिफ़ॉल्ट संख्या 10 है।
सबसे अधिक संभावना है कि आपका ग्राहक कनेक्शन बंद नहीं कर रहा है।

समवर्ती कॉल की संख्या बढ़ाने के लिए, आपको अपने व्यवहार को सेवा कॉन्फ़िगरेशन में जोड़ना होगा, क्लाइंट नहीं।


क्या आप ट्रेसिंग को कॉन्फ़िगर कर सकते हैं और लूप चला सकते हैं? ऐसा हो सकता है कि चैनल गलती हो रही है और ग्राहक को समय निकालने का कारण बन रहा है।


मेरे बालों को एक जैसी ही समस्या पर खींचने के बाद जो Close() या Dispose() द्वारा हल नहीं किया गया था, मैं एक सरल समाधान जोड़ना चाहता हूं जो मेरा दिन बना देता है, अर्थात् ServicePointManager.DefaultConnectionLimit जो डिफ़ॉल्ट रूप से 2 है।

"DefaultConnectionLimit प्रॉपर्टी सर्विसपॉइंट ऑब्जेक्ट्स बनाते समय सर्विसपॉइंटमैनेजर ऑब्जेक्ट कनेक्शन कनेक्शन को असाइन करने वाले समवर्ती कनेक्शन की डिफ़ॉल्ट अधिकतम संख्या सेट करता है।"

मेरे मामले में मेरा आवेदन सफलतापूर्वक मेरी रिमोट सेवा से 2 बार जुड़ा हुआ है, तीसरे प्रयास पर यह बस सेवा से कनेक्ट करने की कोशिश नहीं करता था। इसके बजाय उपर्युक्त प्रश्न में एक ही त्रुटि संदेश के साथ समय समाप्त होने से पहले थोड़ी देर इंतजार कर रहा था। बढ़ते DefaultConnectionLimit ने इसे हल किया। निराशा को जोड़ने के लिए यह व्यवहार कुछ हद तक यादृच्छिक था - 10 के एक मामले में webservice को सफलतापूर्वक एकाधिक (> 2) बार बुलाया गया था।

समाधान उत्पन्न होता है और इन दो धागे पर आगे चर्चा की जाती है: wcf-timeout-exception-detailed-investigation और wcf-service-throttling । मेरी समस्या हल