2009-10-05 16 views
77

एक मूर्ख सवाल की तरह लग सकता है, लेकिन डब्ल्यूसीएफ में सबकुछ एएसएमएक्स की तुलना में बहुत अधिक जटिल लगता है, मैं एक एसवीसी सेवा के टाइमआउट को कैसे बढ़ा सकता हूं?डब्ल्यूसीएफ सेवा, टाइमआउट कैसे बढ़ाएं?

<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 इस तरह मैप किया जाता है:

यहाँ मैं अब तक किया है

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

सटीक त्रुटि मैं हो रही है:

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

WCF टेस्ट क्लाइंट में, कि मेरी सेवा का प्रयोग समय विन्यास शामिल एक config आइकन है:

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

<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> 

उत्तर

23

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

+1

अच्छी तरह से, हाँ - आम तौर पर, इसे क्लाइंट और सर्वर दोनों पर भी सेट करना होगा, उदाहरण के लिए - उदा। सत्रों और उस तरह की चीजों पर "निष्क्रियता टाइमआउट" के मामले में। –

+7

जेएल: क्या आप दिखा सकते हैं कि आपने क्या एक्साक्लिटी किया है? मुझे एक ही समस्या है –

+0

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

154

अपने बंधन विन्यास में, वहाँ चार टाइमआउट मानों आप ठीक कर सकते हैं:

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

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

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

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

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

ओपनटाइमआउट, प्राप्त टाइमआउट और क्लोजटाइमआउट भी है। MSDN docs on binding आपको ये जानकारी देता है कि ये क्या हैं।

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

Learning WCF http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

और आप भी उसे 15 देख कुछ समय बिताने -part "WCF Top to Bottom" स्क्रीनकास्ट श्रृंखला - अत्यधिक अनुशंसित!

अधिक उन्नत विषयों के लिए मैं अनुशंसा करता हूं कि आप जुवाल लोवी की Programming WCF सेवा पुस्तक देखें।

Programming WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

मैं web.config में करने के लिए बाध्यकारी अनुभाग जोड़ने के लिए कोशिश की है, लेकिन इसकी अब एक त्रुटि फेंक .... किसी भी अतिरिक्त चरण मैं मैंने याद किया है ... –

+0

मैंने अपनी सेवा में एंडपॉइंट को

+0

मुझे लगता है कि मुझे यह मिल रहा है - बाइंडिंग = "मूल एचटीपी बाइंडिंग" बाइंडिंग कॉन्फ़िगरेशन = "बढ़ाया टाइमआउट" –

4

हाल ही में एक ही त्रुटि मिली लेकिन हर डब्ल्यूसीएफ क्लाइंट कॉल को बंद करने के लिए इसे सुनिश्चित करके इसे ठीक करने में सक्षम था। उदाहरण के लिए।

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

या

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

'उपयोग' दृष्टिकोण का उपयोग न करें: http: // omaralzabir।com/do-not-use-use-in-wcf-client/ –

+0

http://omaralzabir.com/do-not-use-using-in-wcf-client की टिप्पणियों में, अभी भी कैसे हैं इसके उदाहरण हैं एक दोषपूर्ण चैनल ऑब्जेक्ट का निपटान नहीं करते समय 'उपयोग' का उपयोग करें। यहां एक और ब्लॉगर है जिसका उपयोग 'उपयोग' ब्लॉक के साथ अधिक अनुकूल है: http://erwyn.bloggingabout.net/2006/12/09/WCF- सेवा- प्रॉक्सी- हेल्पर /। – Greg

13

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

चेक आउट:

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

महान टिप, धन्यवाद – ukie

संबंधित मुद्दे