2011-12-05 11 views
16

का उपयोग करें मुझे यह पागल समस्या है जिसे मैं सौदा करने का प्रयास कर रहा हूं। मुझे पता है कि जब हमें बड़ी मात्रा में डेटा मिल रहा है तो हमें क्लाइंट .config फ़ाइल पर कोटा बढ़ाना होगा, लेकिन मुझे क्या करना चाहिए यदि मेरा क्लाइंट डब्ल्यूसीएफ सर्वर को "डेटा" विशाल डेटा भेज रहा है?आने वाले संदेशों के लिए अधिकतम संदेश आकार कोटा (65536) .... कोटा बढ़ाने के लिए, MaxReceivedMessageSize गुण

जब मैं छोटे आकार के इनपुट पैरामीटर भेज रहा हूं तो यह पूरी तरह से सामान्य काम करता है। दुर्भाग्य से, जब इनपुट बड़ा हो जाता है तो यह टूट जाता है।

डिबगर यह कहते हैं:

गलत अनुरोध, 400;

फ़ाइल का पता लगाने पर यह है:

अधिकतम भेजे गए संदेशों (65536) के लिए संदेश आकार कोटा हो गया है। कोटा बढ़ाने के लिए, उचित बाध्यकारी तत्व पर MaxReceivedMessageSize संपत्ति का उपयोग करें।

क्या सर्वर पक्ष पर इनकमिंग डेटा के इस कोटा को बढ़ाने का कोई तरीका है? यदि हां, तो कैसे?

यहाँ मेरी नमूना config संबंधित है भागों:

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

    </basicHttpBinding> 
</bindings> 

<services> 
    <service name="MyWcfService"> 
    <endpoint address="http://myservice..." 
     binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding" 
     name="MyBasicHttpBinding" contract="IMyContract" /> 
    </service> 
</services> 

और यहां मेरे क्लाइंट-साइड कोड है (मैं इसे गतिशील बनाने):

 var binding = new BasicHttpBinding(); 
     binding.MaxBufferPoolSize = 2147483647; 
     binding.MaxBufferSize = 2147483647; 
     binding.MaxReceivedMessageSize = 2147483647; 
     binding.ReaderQuotas.MaxStringContentLength = 2147483647; 
     binding.ReaderQuotas.MaxArrayLength = 2147483647; 
     binding.ReaderQuotas.MaxDepth = 2147483647; 
     binding.ReaderQuotas.MaxBytesPerRead = 2147483647; 


     var address = new EndpointAddress("http://mylocalservice.."); 

     ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address); 

     foreach (OperationDescription op in factory.Endpoint.Contract.Operations) 
     { 
      DataContractSerializerOperationBehavior dataContractBehavior = 
         op.Behaviors.Find<DataContractSerializerOperationBehavior>() 
         as DataContractSerializerOperationBehavior; 
      if (dataContractBehavior != null) 
      { 
       dataContractBehavior.MaxItemsInObjectGraph = 2147483646; 
      } 
     } 
     public IMyContract MyClientObject = factory.CreateChannel(); 
+0

मैं कदम उल्लेख किया [यहां] द्वारा समस्या हल [1] [1]: http: // stackoverflow।कॉम/प्रश्न/7476853/wcf-error-max-number-of-items-that-can-be-serialized-or-deserialized-in-an/8656402 # 8656402 – Ram

+1

अपने क्लाइंट साइड कोड में आप कोडर के माध्यम से रीडरक्वाट सेट कर रहे हैं तो नीचे उन्हें सेट करने का दृष्टिकोण है: XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); myReaderQuotas.MaxStringContentLength = 2147483647; myReaderQuotas.MaxArrayLength = 2147483647; myReaderQuotas.MaxBytesPerRead = 2147483647; myReaderQuotas.MaxDepth = 64; myReaderQuotas.MaxNameTableCharCount = 2147483647; बाइंडिंग। गेट टाइप()। गेटप्रोपर्टी ("रीडरक्वोटास")। सेटवैल्यू (बाध्यकारी, myReaderQuotas, शून्य); – Rajesh

उत्तर

36

आप के माध्यम से सेवा पर MaxReceivedMessageSize संपत्ति सेट कर सकते हैं सेवा की कॉन्फ़िगरेशन फ़ाइल।

क्लाइंट के MaxReceivedMessageSize को सेट करना केवल को क्लाइंट द्वारा संदेशों को प्रभावित करता है; इसका सेवा द्वारा प्राप्त संदेशों पर कोई प्रभाव नहीं पड़ता है। इसके अनुरूप, सेवा को बड़े संदेश प्राप्त करने की अनुमति देने के लिए, आपको सेवा की कॉन्फ़िगरेशन फ़ाइल सेट करने की आवश्यकता है।

नमूना सेवा कॉन्फ़िग

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="MyBinding" maxReceivedMessageSize="2147483647" /> 
    </wsHttpBinding> 
    </bindings> 
    <services> 
    <service name="MyService"> 
     <endpoint address="http://myservice" binding="wsHttpBinding" 
       bindingConfiguration="MyBinding" contract="IMyServiceContract" /> 
    </service> 
    </services> 
</system.serviceModel> 

ऊपर एक बहुत नीचे छीन कॉन्फ़िग फ़ाइल है, लेकिन प्रासंगिक भागों को दर्शाता है। महत्वपूर्ण हिस्सा यह है कि आप बाध्यकारी को परिभाषित करते हैं और इसे एक नाम देते हैं, और डिफ़ॉल्ट रूप से किसी भी मान को सेट करते हैं जो डिफ़ॉल्ट से भिन्न होते हैं, और उस नाम का उपयोग बाध्यकारी कॉन्फ़िगरेशन विशेषता में एंडपॉइंट तत्व पर करते हैं।

+0

बात यह है कि मुझे सर्वर की तरफ कोई बाध्यकारी विन्यास नहीं दिख रहा है। क्या कुछ डिफ़ॉल्ट बाध्यकारी या कुछ है? मैं इसे कैसे ओवरराइड कर सकता हूं? –

+1

हां, वहाँ है। यदि आपके पास अपनी कॉन्फ़िगरेशन फ़ाइल में कोई विशिष्ट बाध्यकारी अनुभाग नहीं है, और इसे बाध्यकारी कॉन्फ़िगरेशन विशेषता के माध्यम से '' तत्व में संदर्भित नहीं किया गया है, तो बाइंडिंग के लिए डिफ़ॉल्ट मान का उपयोग किया जाएगा (जो MaxReceivedMessageSize प्रॉपर्टी के लिए 65536 है)। इसलिए आपको कॉन्फ़िगरेशन में उचित ' 'अनुभाग जोड़ना होगा। – Tim

+0

क्या सर्वर साइड बाइंडिंग और/या एंडपॉइंट कॉन्फ़िगरेशन का कोई उदाहरण है? मैं उस बिंदु पर पहले से ही अटक गया हूँ। –

5

इस समस्या को नीचे दिए गए अतिरिक्त बाध्यकारी नोड को कॉन्फ़िगरेशन फ़ाइल के बाध्यकारी अनुभाग में जोड़कर हल किया जा सकता है।

<basicHttpBinding> 
    <binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> 
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    </binding> 
</basicHttpBinding> 
+3

को संवाद करने के लिए कोई वैकल्पिक तरीका है StackOverflow में आपका स्वागत है। ओपी के पास उनके कॉन्फ़िगरेशन में एक बहुत ही समान कोड है। आपके उत्तर में उनके उत्तर से बेहतर तरीका क्या है? उत्तर देने के द्वारा आप अपना उत्तर सुधार सकते हैं कि उन्होंने पहले नहीं किया था। अधिकांश उत्तरों में – carlosfigueira

6

मेरी समस्या wcf परीक्षण क्लाइंट के साथ थी। किसी कारण से, यह बढ़ाए गए maxReceivedMessageSize के साथ क्लाइंट कॉन्फ़िगरेशन उत्पन्न नहीं करेगा। मेरा फ़िक्स "कॉन्फ़िगर फ़ाइल" पर राइट क्लिक करना था -> "SvcConfigEditor के साथ संपादित करें" -> बाइंडिंग्स -> maxReceivedMessageSize।

+0

वे दिखाते हैं कि सर्वर पर इन सेटिंग्स को कैसे सेट करें। लेकिन यदि आपने अभी भी त्रुटि की है, जैसा कि आपने बताया है, हमें क्लाइंट पर इन सेटिंग्स को कॉन्फ़िगर करना चाहिए। मेरे मामले में , अनुप्रयोग है कि पहले वेब सेवा खपत की app.config इस तरह देखा: <बाध्यकारी नाम = "BasicHttpBinding_ICGSIncomingSOAPCalls" /> <बाध्यकारी नाम = "BasicHttpBinding_MyICGSIncomingSOAPCalls" /> मैं इस तरह संशोधित (देखें भाग 2): – mihai71

+0

... भाग 2: <बाध्यकारी नाम = "BasicHttpBinding_ICGSIncomingSOAPCalls" maxReceivedMessageSize = "10485760" maxBufferPoolSize = "10485760" maxBufferSize = " 10485760 "/> <बाध्यकारी नाम = "BasicHttpBinding_MyICGSIncomingSOAPCalls" maxReceivedMessageSize = "10485760" maxBufferPoolSize = "10485760" maxBufferSize = "10485760" /> और यह ठीक काम किया। – mihai71

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