risposta-alla-domanda-sullo-sviluppo-web-bd.com

"La lunghezza massima della lunghezza del contenuto di stringhe (8192) è stata superata durante la lettura dei dati XML" durante l'invio della stringa XML a WCF

Sto lavorando con un'applicazione .NET, C # che intende inviare una lunga stringa XML a un metodo di servizio WCF per ulteriori operazioni. Quando la mia applicazione tenta di inviare la stringa XML al servizio WCF in runtime, ricevo un messaggio di errore: 

"The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:strProdUserDataXML. The InnerException message was 'There was an error deserializing the object of type System.String. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. Line 131, position 57.'. Please see InnerException for more details."

Il mio lato applicazione web.config ho scritto "binding" e "endpoint" come:

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

    <endpoint address="http://192.168.140.40/WcfGenericPortal_Service/Service1.svc" binding="basicHttpBinding" bindingConfiguration="EndPointHTTPGenericPortal" contract="IService1" name="EndPointHTTPGenericPortal" behaviorConfiguration="Graph" />

Se qualche corpo mi può aiutare su come risolvere questo errore, sarò molto obbligato . Grazie a tutti in anticipo.

17
Pinaki Karuri

Ecco un articolo su MSDN su Quote dei lettori .

Sembra che una delle quote del lettore sul tuo server venga superata. 

In particolare, maxStringContentLength viene superato. Il valore predefinito è 8192 caratteri per maxStringContentLength che come descritto dal messaggio di errore viene superato.

Ma potrebbe non essere l'approccio migliore per far salire tutti i valori al massimo 2147483647 come altri hanno suggerito.

Come scritto nella documentazione MSDN che ho collegato:

I vincoli di complessità forniscono protezione dalla negazione del servizio (DOS) attacchi che tentano di usare la complessità del messaggio per legare risorse di elaborazione endpoint. Altri vincoli di complessità includono elementi come una profondità massima dell'elemento e una lunghezza massima per la stringa contenuto nel messaggio.

Accoppiato con il fatto che attualmente hai Modalità di sicurezza impostata su Nessuno - potresti aver impostato per te qualche problema.

10
Derek W

Ho ricevuto questo errore e risolvo aggiungendo questa proprietà - MaxItemsInObjectGraph per il servizio nella configurazione del client e del server.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

lato server

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior name="Service.Service1Behavior">
        <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      </behavior>
</system.serviceModel>

Dalla parte del cliente

<behaviors >
  <endpointBehaviors>
    <behavior name="endpointbehaviour">
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </endpointBehaviors>
</behaviors>

e non dimenticare di applicare questo comportamento a EndPoint behaviorConfiguration = "endpointbehaviour"

8
Lingaraj

Rilegatura lato client

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

<behaviors>
<endpointBehaviors>
<behavior name="KAMServiceDistributor">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://localhost:1234/xxxx/Service.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService11"
contract="yourservice namespae" name="AnyName" />
</client>
</system.serviceModel>

File di configurazione del servizio:

<system.serviceModel>
<behaviors>


<serviceBehaviors>
<behavior name="ServiceBehaviour">
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceMetadata httpGetEnabled="true" />
<dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding>
<binding <b>maxReceivedMessageSize="2147483647"</b>>
<readerQuotas maxDepth="128" maxStringContentLength="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="ServiceBehaviour" name="Service">
<endpoint binding="basicHttpBinding" contract="IService" />
</service>
</services>
</system.serviceModel>
6

Pinaki Karuri,

le lunghezze delle quote dipendono non solo dalla configurazione del client, ma dipendono anche da quella del server. Per favore pubblica il web.config del tuo server WCF in modo che possiamo chiarire il problema. C'è una probabilità che tu abbia già impostato la quota per 8192, quindi il modo più veloce per te sarebbe quello di trovare e aumentare il suo valore.

Aggiornare

Per quanto posso vedere, manca il nodo "readerQuotas" dal web.config del server, quindi MaxStringContentLength ha il suo valore impostato su default (8192). Si prega di fare riferimento a questo link per ulteriori informazioni: http://msdn.Microsoft.com/en-us/library/system.xml.xmldictionaryreaderquotas.maxstringcontentlength.aspx

5
Piotr Justyna

Prova a impostare le seguenti cose in binding.

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
    maxArrayLength="2147483647" maxBytesPerRead="2147483647"
    maxNameTableCharCount="2147483647" />

Ha risolto il mio problema. Per ulteriori riferimenti, trova il seguente link http://blogfornet.com/2013/08/the-maximum-string-content-length-quota-8192-has-been-exceeded-while-reading-xml-data/

4

Verifica che il tuo Target Framework per il client sia uguale a quello del servizio. Ho avuto questo problema e ho provato tutte le correzioni di cui sopra ma non ha funzionato. Proprietà controllate e controllato Target Framework e modificato.

0
Luigi