WCF - संदेश आकार कोटा कैसे बढ़ाएं


454

मेरे पास एक WCF सेवा है जो डेटाबेस से क्लाइंट तक 1000 रिकॉर्ड लौटाती है। मेरे पास ASP.NET WCF क्लाइंट है (मैंने WCF का उपभोग करने के लिए asp.net वेब एप्लिकेशन प्रोजेक्ट में सेवा संदर्भ जोड़ा है)।

क्लाइंट एप्लिकेशन चलाने पर मुझे निम्न संदेश मिलता है:

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

कोई मदद? मैसेज साइज कोटा कैसे बढ़ाएं?


मैं एक ही समस्या थी, लेकिन मैं सिर्फ एक अमित्र नेटवर्क त्रुटि 400 था, लेकिन समाधान संदेश आकार thingie था ..
श्री डब्ल्यू

2
मैंने [लिंक] [1] [1] में वर्णित चरणों का उपयोग करके समस्या का हल किया: stackoverflow.com/questions/7476853/…
राम

यह डिफ़ॉल्ट रूप से इतना कम क्यों सेट किया गया है? सुरक्षा?
Coops

@ सुरक्षा के लिए वास्तव में। उदाहरण के लिए डीडीओएस हमलों के लिए संदेशों पर एक कोटा निर्धारित करके (कम से कम थोड़ा सा) निष्पादित करना कठिन है।
पीटर वैन केकेम

जवाबों:


608

आप App.config या Web.config फ़ाइल में संदेश आकार कोटा बढ़ाने के लिए ऐसा कुछ चाहते हैं :

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

और अपने समापन बिंदु कॉन्फ़िगरेशन में बाइंडिंग नाम का उपयोग करें

...
bindingConfiguration="basicHttp"
...

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


20
धन्यवाद..यह परिवर्तन ग्राहक अनुप्रयोग के web.config फ़ाइल में किए जाने की आवश्यकता है।
बगबर्गर

8
आपको इसे सर्वर पर बदलने की भी आवश्यकता हो सकती है - उस स्थिति में जब आपको WCF मेथड के पैरामीटर के रूप में बड़े डेटासेट में भेजने की आवश्यकता होती है।
नैट

9
अधिकांश संदेशों को पूरा करने के लिए पर्याप्त रूप से बड़ा है। आप अपनी आवश्यकताओं को पूरा करने के लिए उस नंबर को ट्यून कर सकते हैं। यह मूल रूप से डॉस प्रकार के हमलों को रोकने के लिए है। इसे 20000000 बनाने से एक वितरित डॉस हमले के लिए प्रभावी होने की अनुमति मिलती है, 64k के डिफ़ॉल्ट आकार को इन दिनों अधिकांश सर्वरों पर हावी होने के लिए बहुत बड़ी संख्या में ग्राहकों की आवश्यकता होगी।
नैट

18
जो लोग रुचि रखते हैं, उनके लिए मैं दूसरे ब्लॉग पर पढ़ता हूं कि अधिकतम आकार 2147483647 है। 20000000 इस संख्या से थोड़ा छोटा है, इसलिए सबसे छोटी संख्या का उपयोग करके आप बिना किसी बाधा के सेवा से दूर हो सकते हैं।
प्राग्वेकदाद

5
@Slauma सर्वर पर इसे बदलने की आवश्यकता होगी यदि वह आने वाला पैरामीटर बहुत बड़ा था; अन्यथा (और अधिक संभावना है) क्लाइंट कॉन्फ़िगरेशन फ़ाइल में परिवर्तन की आवश्यकता है, क्योंकि यह सेवा की प्रतिक्रिया है (इसके पैरामीटर नहीं) जो बहुत बड़ी है।
नैट

155

यदि आपको WCF टेस्ट क्लाइंट का उपयोग करते समय यह त्रुटि संदेश मिल रहा है, तो इसका कारण यह है कि क्लाइंट के पास एक अलग MaxBufferSize सेटिंग है।

समस्या को ठीक करने के लिए:

  1. विन्यास फाइल पर राइट-क्लिक करेंपेड़ के नीचे स्थित नोड पर
  2. SvcConfigEditor के साथ संपादन का चयन करें

MaxBufferSize सहित संपादन योग्य सेटिंग्स की एक सूची दिखाई देगी।

नोट: ऑटो-जेनरेट किए गए प्रॉक्सी क्लाइंट्स ने डिफ़ॉल्ट रूप से MaxBufferSize को 65536 पर सेट किया है।


8
क्यों ओह मैं हमेशा इस बारे में क्यों भूल जाता हूं? +1
जेम्स स्कैपी

9
यदि लोग इसे ढूंढ रहे हैं तो vs2013 SvcConfigEditor को Edit WCF कॉन्फ़िगरेशन से बदल दिया गया है।
ज़ूमविरस

SVCconfigEditor खोजने में सक्षम नहीं है?
अरुल सिद्धन

आप इसे बाइंडिंग फ़ोल्डर के नीचे पाएंगे, सर्विस के लिए बाइंडिंग पर क्लिक करें और यह वहां है।
समीर अलीभाई

यदि आपकी कॉन्फ़िग फ़ाइल स्वतः उत्पन्न होती है, तो आपको इसे इस तरह से करना चाहिए। जब भी आप अपने संदर्भ को अपडेट करते हैं, तो यह app.config को फिर से प्राप्त करेगा, और आपको इसे फिर से मैन्युअल रूप से बदलना होगा। यदि आप इसे VS बदलते हैं, तो नए परिवर्तन आपके द्वारा चुनी गई सेटिंग्स को समायोजित करेंगे।
Kingfrito_5005

104

यदि आप अपने WCF बाइंडिंग को गतिशील रूप से यहाँ उपयोग करने के लिए कोड बना रहे हैं:

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;

आप इसे इनिशियलाइज़ कर सकते हैं। स्पष्ट रूप से आप इसे अपनी निर्माण विधि का उपयोग कर सकते हैं।
aemre

45

WCF टेस्ट क्लाइंट उसके अपने ग्राहक config है।

परीक्षण क्लाइंट चलाएं और नीचे स्क्रॉल करें। यदि आप कॉन्फ़िगर फ़ाइल नोड पर डबल क्लिक करते हैं, तो आप XML प्रतिनिधित्व देखेंगे। आप देख सकते हैं maxReceivedMessageSizeहै65536

इसे संपादित करने के लिए, कॉन्फ़िग फ़ाइल ट्री नोड पर राइट क्लिक करें और एडिट विथ का चयन करें SvcConfigEditor । जब संपादक बाइंडिंग का विस्तार खोलता है और स्वचालित रूप से उत्पन्न होने वाले बंधन पर डबल क्लिक करता है।

आप यहां सहित सभी संपत्तियों को संपादित कर सकते हैं maxReceivedMessageSize। जब आप काम पूरा कर लें तो फाइल को सेव करें

अंत में, जब आप WCF टेस्ट क्लाइंट विंडो पर वापस आते हैं, तो टूल्स - विकल्प पर क्लिक करें ।

ध्यान दें : सेवाओं को लॉन्च करते समय हमेशा पुनर्जीवित कॉन्फ़िगरेशन को अनचेक करें


2
शायद सबसे अच्छा जवाब यहाँ!
हरिस

3
नोट अनचेक करने के कारण upvote Always regenerate config
उग्र

मेरी राय में सरलतम हल। मुझे कुछ सिरदर्द से बचाया।
जारेड बीच

अगर लोग इसे ढूंढ रहे हैं तो vs2013 SvcConfigEditor को Edit WCF कॉन्फ़िगरेशन से बदल दिया गया है।
ज़ूमविरस

धन्यवाद। परीक्षण क्लाइंट कॉन्फ़िगरेशन के साथ समस्या होने पर, सर्वर को बार-बार बदलते हुए, मेरे सिर को कुछ समय के लिए तोड़ दिया गया!
फहद

24

मुझे आसान रास्ता मिल गया

--- दाईं ओर webconfig या ऐप कॉन्फिग फाइल पर क्लिक करें और EDIT WCF CONFIGURATION पर क्लिक करें और bingdigs ans को yore सर्विस चुनें और राइट साइड शो maxReciveMessageSize को बड़ी संख्या दें ---


2
यह एक महान जवाब था, मुझे नहीं पता था कि मैं यहां से संपादित कर सकता हूं, धन्यवाद
अल्बर्ट श

8

मैं समस्या को हल करता हूं ... इस प्रकार है

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>

20
यह मेरे समाधान से कैसे भिन्न है? आपके अलावा आपके कॉन्फ़िगरेशन के सभी अप्रासंगिक भागों के साथ-साथ संबंधित भागों को भी शामिल किया गया है और आपने 200 मी के बजाय अधिकतम संभावित मूल्य को चुना है?
नैट

3
प्रसंग भी अच्छा है ... शायद इन दोनों उत्तरों को मिला दिया जाए?
जेफ

1
क्या वह सेटिंग सर्वर या क्लाइंट में कॉन्फ़िगर की जानी चाहिए?
जॉन केडी

8

मैंने अपने प्रॉजेक्ट पर बिंग मैप्स WPF पर कैलकुलेट रीटाउट () का उपयोग करके अपना मुद्दा हल किया। मेरे मामले में समाधान maxReceivedMessageSize और maxReceivedMessageSize को "customBinding" अनुभाग के लिए विशेषता "httpTransport" पर सेट कर रहा था।

मैं इस कॉन्फ़िगरेशन में एप्लिकेशन्स.कॉन्फ़िग फ़ाइल (उदाहरण। myApp.config) में सेट करता हूँ:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IGeocodeService" />
            <binding name="BasicHttpBinding_IRouteService" />
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_IGeocodeService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
            <binding name="CustomBinding_IRouteService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
            contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
            contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
    </client>
</system.serviceModel>

6

<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>


अपना उत्तर पोस्ट करने के लिए बढ़िया है। यह महत्वपूर्ण है कि "बाइंडिंगऑनफिगरेशन" मान बाध्यकारी नाम से मेल खाता है। आपके उदाहरण में "wsHttpBinding_Username"।
ब्रूनो बीरी

6

के लिए HTTP:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000" 
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="200" 
             maxArrayLength="200000000"
             maxBytesPerRead="4096"
             maxStringContentLength="200000000"
             maxNameTableCharCount="16384"/>
    </binding>
  </basicHttpBinding>
</bindings>

के लिए टीसीपी:

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="200"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"
           maxBytesPerRead="4096"
           maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

जरूरी:

यदि आप जटिल ऑब्जेक्ट को पास करने की कोशिश करते हैं जिसमें कई जुड़े ऑब्जेक्ट हैं (जैसे: एक ट्री डेटा संरचना, एक सूची जिसमें कई ऑब्जेक्ट हैं ...), तो संचार विफल हो जाएगा, चाहे आप कोटा को कैसे बढ़ाएं। ऐसे मामलों में, आपको आवश्यक वस्तुओं की गिनती बढ़ानी चाहिए:

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      ...
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

maxItemsInObjectGraphमेरे लिए (त्वरित) समाधान था। लेकिन इसे बढ़ाते समय, आपको यह सोचना चाहिए कि क्या चांस में डेटा का अनुरोध करने के लिए आपके आवेदन के लिए बेहतर समाधान है, जैसा कि एक विशाल ऑब्जेक्ट ग्राफ के विपरीत है जो संसाधनों को तनाव दे सकता है।
पॉल

6

मेरे लिए, मुझे केवल इतना करना maxReceivedMessageSize="2147483647"होगा कि ग्राहक app.config में जोड़ें । सर्वर अछूता रह गया।


5

मेरे अनुभव से एक और महत्वपूर्ण बात ..

मैं अधिक से अधिक मैक्सबफ़रपूल को अधिकतम करने की सलाह नहीं दूंगा, क्योंकि ऐप-डोमेन (यानी एप्लिकेशन पूल) रीसायकल तक पूल से बफ़र्स कभी जारी नहीं किए जाते हैं।

उच्च ट्रैफ़िक की अवधि बहुत अधिक मेमोरी का उपयोग कर सकती है और कभी जारी नहीं की जा सकती।

यहाँ अधिक जानकारी:


3

यह मत भूलो कि निष्पादन प्रविष्टि बिंदु के app.config पर विचार किया जाएगा, न कि यदि कोई है तो वेब-सेवा कॉल का प्रबंधन करने वाले क्लास लाइब्रेरी प्रोजेक्ट में एक।

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


0

मुझे यह त्रुटि तब मिली जब web.config पर इस सेटिंग्स का उपयोग किया गया

System.ServiceModel.ServiceActivationException

मैंने इस तरह सेटिंग की:

      <service name="idst.Controllers.wcf.Service_Talks">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
      binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
  </service>
  <service name="idst.Controllers.wcf.Service_Project">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
      binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
      contract="idst.Controllers.wcf.Service_Project" />
  </service>
</services>

<bindings>
<basicHttpBinding>
    <binding name="largBasicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
    </binding>
</basicHttpBinding>


4
इसलिए, आपने नैट के उत्तर का उपयोग करके अपनी समस्या को ठीक कर लिया और फिर इसे अपने रूप में पोस्ट किया। अछा नहीं लगता।
आर्कन

@arcain Nates का जवाब बहुत ही सामान्य था, स्टॉक के नाम और नंबरों का उपयोग करके, जिनके अक्सर आने की उम्मीद की जा सकती है। यह उत्तर चोरी नहीं था, यह केवल सही उत्तर है। चूंकि केवल एक सही उत्तर है, इसे दोहराया जाना बाध्य था।
Kingfrito_5005

@ kingfrito_5005 "सही" उत्तर पहले से ही था जब उत्तरदाता ने इसे पोस्ट किया था। उसने नैट के bindingsतत्व को स्पष्ट रूप से उठा लिया और उसे अपने जवाब के हिस्से के रूप में प्रतिष्ठित किया। वे 2000000मूल्य बहुत अलग हैं।
आर्कन जूल

@arcain, मैं असहमत हूं जो बहुत मानक मूल्य हैं, मेरी कंपनी उन्हें हमारे बाध्यकारी तत्वों में भी उपयोग करती है।
Kingfrito_5005
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.