WCF सेवा, टाइमआउट कैसे बढ़ाएं?


93

एक मूर्खतापूर्ण प्रश्न की तरह लग सकता है, लेकिन WCF में सब कुछ asmx की तुलना में बहुत अधिक जटिल लगता है, मैं एक svc सेवा के समय में वृद्धि कैसे कर सकता हूं?

यह है, जो कि अभी तक मेरे पास है:

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

और फिर मेरा समापन बिंदु इस तरह से मैप हो जाता है:

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

मुझे मिल रही सटीक त्रुटि:

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

WCF टेस्ट क्लाइंट में, एक कॉन्फ़िगरेशन आइकन होता है जिसमें मेरी सेवा का रन टाइम कॉन्फ़िगरेशन होता है:

जैसा कि आप देख सकते हैं कि इसके समान मूल्य नहीं हैं जैसा कि मैंने इसके लिए निर्धारित किया है? मैं क्या गलत कर रहा हूं?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

जवाबों:


179

आपके बाइंडिंग कॉन्फ़िगरेशन में, चार टाइमआउट मान हैं जिन्हें आप ट्विक कर सकते हैं:

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

सबसे महत्वपूर्ण है sendTimeout, जो कहता है कि ग्राहक आपकी WCF सेवा से प्रतिक्रिया के लिए कितनी देर तक प्रतीक्षा करेगा। आप hours:minutes:secondsअपनी सेटिंग में निर्दिष्ट कर सकते हैं - मेरे नमूने में, मैं 25 मिनट के लिए समय निर्धारित करता हूं।

openTimeoutनाम का तात्पर्य के रूप में समय की राशि है जो आप जब आप अपने WCF सेवा से कनेक्शन खोलने प्रतीक्षा करने के लिए तैयार हैं। इसी तरह, वह closeTimeoutसमय होता है जब आप कनेक्शन को बंद करते हैं (क्लाइंट प्रॉक्सी को डिस्पोज करें) जिसे आप अपवाद के फेंकने से पहले इंतजार करेंगे।

के receiveTimeoutलिए एक दर्पण की तरह एक सा है sendTimeout- जबकि भेज समय आप सर्वर से एक प्रतिक्रिया के लिए इंतजार करेंगे समय receiveTimeoutकी राशि है, समय की राशि है कि आप ग्राहक को प्राप्त करने और प्रतिक्रिया से प्रक्रिया करने के लिए आपको दे देंगे। सर्वर।

यदि आप "सामान्य" संदेश भेजते हैं, तो दोनों बहुत कम हो सकते हैं - विशेष रूप से receiveTimeout, SOAP संदेश प्राप्त करने के बाद से, इसे डिक्रिप्ट करना, जाँचना और डीसर्विलाइज़ करना लगभग कोई समय नहीं लेना चाहिए। स्ट्रीमिंग के साथ कहानी अलग है - उस स्थिति में, आपको क्लाइंट पर उस समय की अधिक समय की आवश्यकता हो सकती है, जो आपको सर्वर से वापस मिलने वाली धारा के "डाउनलोड" को पूरा करने के लिए है।

वहाँ भी OpenTimeout, ReceTimeout, और closeTimeout है। बंधन पर MSDN डॉक्स तुम क्या इन के लिए कर रहे हैं के बारे में अधिक जानकारी देता है।

WCF की सभी पेचीदगियों पर एक गंभीर पकड़ पाने के लिए, मैं दृढ़ता से आपको मिशेल लेरौक्स बुस्टामेंटे द्वारा " लर्निंग डब्ल्यूसीएफ " पुस्तक खरीदने की सलाह दूंगा :

लर्निंग WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,opRight,35,-76_AA240_SH20_OU01_.jpg

और आप कुछ समय उसके 15-भाग " WCF टॉप टू बॉटम " स्क्रेंकास्ट श्रृंखला को देखने में बिताएंगे - अत्यधिक अनुशंसित!

अधिक उन्नत विषयों के लिए मेरा सुझाव है कि आप Juwal Lowy की प्रोग्रामिंग WCF सेवा पुस्तक देखें।

प्रोग्रामिंग WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRad,35,-76_AA240_SH20_OU01_.jpg


मैंने web.config में बाध्यकारी अनुभागों को <system.serviceModel> से जोड़ने की कोशिश की है, लेकिन अब इसकी एक त्रुटि है .... जो भी अतिरिक्त चरण मुझे याद आ गए हैं ...
JL।

मैंने अपनी सेवा में समापन बिंदु को <समापन बिंदु पते = "" बाइंडिंग = "इनकमिंग टाइमआउट" में भी बदल दिया - क्या यह गलत काम है?
जेएल

मुझे लगता है कि मैं इसे प्राप्त करता हूं - बाइंडिंग = "बेसिकहेटबाइंडिंग" बाइंडिंगऑनफिगरेशन = "इनकमिंग टाइमआउट"
जेएल।

बिल्कुल - बाइंडिंग आपके द्वारा उपयोग किए जाने वाले प्रोटोकॉल का प्रकार है - बेसिकहेट्प, wsHttp, netTcp। बाइंडिंग कॉन्फ़िगरेशन यह कॉन्फ़िगरेशन है जिसे आप टाइमआउट आदि को संशोधित करने के लिए कॉन्फ़िगरेशन में बनाते हैं
marc_s

ऐसा करने के बाद भी मजेदार, अभी भी एक टाइमआउट त्रुटि हो रही है, मार्क क्या आप कृपया अधिक से अधिक जानकारी दे सकते हैं?
जेएल

27

सबसे अच्छा तरीका है कि आप अपने कोड में किसी भी सेटिंग को बदलना चाहते हैं।

नीचे दिए गए उदाहरण देखें:

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

यह विन्यास को अपडेट करने के बजाय एक बेहतर समाधान है, इसलिए मैं अलग-अलग कॉल और सेवाओं के लिए एक अलग मूल्य कॉन्फ़िगर कर सकता हूं, बहुत धन्यवाद
सलीम

26

मध्यांतर कॉन्फ़िगरेशन को क्लाइंट स्तर पर सेट करने की आवश्यकता होती है, इसलिए मैं जो कॉन्फ़िगरेशन वेब में सेट कर रहा था। कोई प्रभाव नहीं था, WCF परीक्षण टूल का अपना कॉन्फ़िगरेशन है और जहां आपको टाइमआउट सेट करने की आवश्यकता है।


1
ठीक है, हाँ - आम तौर पर, इसे क्लाइंट और सर्वर दोनों पर सेट करना पड़ता है, यहाँ तक कि - जैसे सत्रों और उस तरह की चीजों पर "निष्क्रियता टाइमआउट" के मामले में।
marc_s

8
JL: क्या आप दिखा सकते हैं कि आपने क्या किया है? मैं एक ही मुद्दा रहा हूँ
निक कान

यदि आपका 'WCF टेस्ट क्लाइंट' का उपयोग कर रहा है, तो सर्विस ट्री में 'कॉन्फ़िग फ़ाइल' पर राइट क्लिक करें, फिर 'Edit with SvcConfigEditor' पर क्लिक करें और बाइंडिंग के भीतर टाइमआउट बदलें।
रदरज

4

हाल ही में एक ही त्रुटि हुई, लेकिन इसे हर wcf क्लाइंट कॉल को बंद करके सुनिश्चित करने में सक्षम था। जैसे।

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

या

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
'का उपयोग कर' दृष्टिकोण का उपयोग न करें: omaralzabir.com/do-not-use-use-in-wcf-client
एलेक्स मार्शल

Omaralzabir.com/do-not-not-use-using-in-wcf-client की टिप्पणियों में , usingदोषपूर्ण चैनल ऑब्जेक्ट को डिस्पोज़ न करते हुए कैसे अभी भी उपयोग करना है, इसके उदाहरण हैं । यहां usingब्लॉक के साथ अधिक संगत दृष्टिकोण वाला एक और ब्लॉगर है : erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper
ग्रेग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.