2009-01-21 23 views
36

मैं छवियों का आकार बदलने के लिए एक छोटा डब्ल्यूसीएफ/डब्ल्यूपीएफ ऐप लिख रहा हूं लेकिन डब्ल्यूसीएफ मुझे दुःख दे रहा है जब मैं क्लाइंट से अपनी सेवा के लिए आकार 28K की एक छवि भेजने की कोशिश करता हूं। जब मैं इसे छोटी छवियां भेजता हूं तो सेवा ठीक काम करती है। मैंने तुरंत यह माना कि यह एक कॉन्फ़िगरेशन समस्या थी और मैंने वेब बाध्यकारी कॉन्फ़िगरेशन में MaxArrayLength संपत्ति के संबंध में पोस्ट को देखकर वेब पर ट्रेल किया है। Ive अधिकतम 2147483647 करने के लिए दोनों क्लाइंट और सर्वर पर इन सेटिंग्स पर सीमा बढ़ा, लेकिन अभी भी मैं निम्नलिखित त्रुटि मिलती है:अधिकतम सरणी लंबाई कोटा

The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://mywebsite.com/services/servicecontracts/2009/01:OriginalImage . The InnerException message was 'There was an error deserializing the object of type System.Drawing.Image. The maximum array length quota (16384) has been exceeded while reading XML data. This quota may be increased by changing the MaxArrayLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.'. Please see InnerException for more details.

मैं एक ही configs मेरे क्लाइंट और सर्वर बनाया है और वे ऐसा दिखाई देगा: सर्वर:

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
      <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
       hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
       maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" 
       maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxDepth="32" 
           maxStringContentLength="2147483647" 
           maxArrayLength="2147483647" 
           maxBytesPerRead="2147483647" 
           maxNameTableCharCount="2147483647" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior"> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:900/mex/"/> 
        <add baseAddress="net.tcp://localhost:9000/" /> 
       </baseAddresses> 
      </host> 
      <endpoint binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" /> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
</system.serviceModel> 

और जैसे मेरे मुवक्किल config दिखता है:

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
      <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
       hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
       maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" 
       maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxDepth="32" 
           maxStringContentLength="2147483647" 
           maxArrayLength="2147483647" 
           maxBytesPerRead="2147483647" 
           maxNameTableCharCount="2147483647" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </netTcpBinding> 
    </bindings> 
    <client> 
     <endpoint address="net.tcp://localhost:9000/" binding="netTcpBinding" 
      bindingConfiguration="NetTcpBinding_ImageResizerServiceContract" 
      contract="ImageResizerService.ImageResizerServiceContract" 
      name="NetTcpBinding_ImageResizerServiceContract"> 
      <identity> 
       <userPrincipalName value="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

यह कोई फर्क नहीं पड़ता लगता है कि मैं क्या इन मूल्यों को स्थापित करने के लिए मैं अभी भी एक erro मिल आर कह रहा है कि डब्ल्यूसीएफ मेरी फाइल को क्रमबद्ध नहीं कर सकता क्योंकि यह 16384 से अधिक है। कोई विचार?

अद्यतन: userPrincipalName टैग में ईमेल पते मेरी गोपनीयता

+0

अपने स्वयं के उत्तर को सही के रूप में चिह्नित करने पर विचार करें। :) –

+0

ImageResizerService क्या करता है? कोई नमूना कोड? – Kiquenet

उत्तर

38

मेरे बुरा के लिए बदल दिया गया है - मैं अपने सर्वर साइड config में अपने अंत बिंदु करने के लिए अपने बाध्यकारी विन्यास लागू करने के लिए भूल गया था। सर्वर config पढ़ना चाहिए:

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
      <binding name="NetTcpBinding_ImageResizerServiceContract" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
       hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
       maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10" 
       maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxDepth="2147483647" 
           maxStringContentLength="2147483647" 
           maxArrayLength="2147483647" 
           maxBytesPerRead="2147483647" 
           maxNameTableCharCount="2147483647" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
        <message clientCredentialType="Windows" /> 
       </security> 
      </binding> 

     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="LogoResizer.WCF.ServiceTypes.ImageResizerService" behaviorConfiguration="ServiceBehavior"> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:900/mex/"/> 
        <add baseAddress="net.tcp://localhost:9000/" /> 
       </baseAddresses> 
      </host> 
      <endpoint bindingConfiguration="NetTcpBinding_ImageResizerServiceContract" binding="netTcpBinding" contract="LogoResizer.WCF.ServiceContracts.IImageResizerService" /> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
</system.serviceModel> 

नोट bindingConfiguration = "NetTcpBinding_ImageResizerServiceContract" netTcp समाप्ति बिंदु को जोड़ा गया है। मेरा ऐप अब बड़ी छवियों के साथ काम करता है। मिठाई।

+0

मैंने इस सटीक मुद्दे को हल करने की कोशिश कर सीधे 4 घंटे तक डेस्क पर अपने सिर को हराया - एक ही समस्या, बाध्यकारी सही ढंग से मैप नहीं किया गया था। धन्यवाद! – GalacticCowboy

+0

ने भी मेरी मदद की। धन्यवाद। – mark

+0

@ डेव इवांस मुझे एक ही समस्या है। लेकिन मैं विंडोज़ फोन 8 से डब्ल्यूसीएफ सेवा में बड़ी बाइट सरणी स्थानांतरित कर रहा हूं। मैंने सुना है कि wp8 केवल 'basicHttp बाइंडिंग' का समर्थन करता है। तो क्या आपके पास इसका कोई समाधान है? –

6

कृपया बाध्यकारी में <readerQuotas> जोड़ें।

बाइट अपलोड करने और डाउनलोड करते समय यह मुख्य मुद्दा है [], यह मेरी समस्या का समाधान करता है।

<basicHttpBinding> 
    <binding name="ServicesBinding" transferMode="Streamed" maxBufferSize="200000000" 
     maxReceivedMessageSize="200000000" messageEncoding="Text" 
     receiveTimeout="00:10:00"> 
     <readerQuotas maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
    </binding> 
</basicHttpBinding> 
2

मैंने माइक्रोसॉफ्ट एसडीके एसवीसी कॉनफिग एडिटर का उपयोग किया। यदि आप विजुअल स्टूडियो (जिसका अपना संस्करण है) का उपयोग करते हैं तो आपके पास यह है। यह भी एक मुफ्त डाउनलोड है।

अपनी हार्ड ड्राइव (प्रोग्राम फ़ाइलें और प्रोग्राम फ़ाइलें (x86) दोनों की जाँच करें) पर:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\SvcConfigEditor.exe

C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\NETFX 4.0 Tools\SvcConfigEditor.exe

आप माइक्रोसॉफ्ट एसडीके, कौन-सा संस्करण आप नेट का कौन सा संस्करण पर निर्भर करेगा का उपयोग के कई इंस्टॉल पर है, तो आप के तहत विकास कर रहे हैं। टूल आपको यह बताने के लिए एक त्रुटि फेंक देगा कि आपने गलत संस्करण के तहत .dll फ़ाइल खोलने का प्रयास किया है।

टूल का उपयोग करने के लिए, अपनी सेवा की .dll फ़ाइल पर इंगित करें और टूल को भारी उठाने दें। यदि आपके पास सेवाओं (प्रॉक्सी सेवाओं) से बात करने वाली सेवाएं हैं तो यह विशेष रूप से सहायक होता है। साथ ही, ध्यान रखें कि आपको शायद अपने क्लाइंट (एप्लिकेशन पर) और सर्वर कॉन्फ़िगरेशन (webservice पर) दोनों के लिए कॉन्फ़िगरेशन सेटिंग की आवश्यकता होगी।

मैं सर्वर-साइड एंडपॉइंट पर कॉन्फ़िगरेशन खो रहा था।मैं दो काम करने के लिए किया था:

  1. मेरे सर्वर साइड config, SvcConfigEditor
  2. का उपयोग कर

इसके अलावा SvcConfigEditor उपकरण में MaxArrayLength सेट करना न भूलें कॉन्फ़िगर किया गया पर एक endpoint रखो, ASP.NET था इस मूल्य बारे में चयन किया जा रहा है, तो आप बाध्यकारी आपके विन्यास को सरल बनाने और इसे बंद करने की कोशिश कर सकते:

<serviceHostingEnvironment multipleSiteBindingsEnabled="false" /> 
-2
यह

, एस काम कर रहा है, पहले net.tcp के संदर्भ दिखा: // mys wervice सेवा ब्राउज़ करते समय ervice.com/Ac_Service.svc/mex लेकिन अब यह http://myservice.com/Ac_Service.svc?wsdl

यह बिना किसी समस्या के भविष्य में भी काम करेगा।

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