web-dev-qa-db-fra.com

Erreur "Le quota de longueur de contenu de chaîne maximale (8192) a été dépassé lors de la lecture de données XML" erreur lors de l'envoi de la chaîne XML à WCF

Je travaille avec une application .NET, C # qui a l'intention d'envoyer une longue chaîne XML à une méthode de service WCF pour une opération ultérieure. Lorsque mon application tente d'envoyer la chaîne XML au service WCF au moment de l'exécution, un message d'erreur s'affiche:

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

Mon application web.config J'ai écrit "binding" & "endpoint" comme suit:

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

Si un organisme pouvait m'aider à résoudre cette erreur, je serais très obligé. Merci à tous d'avance.

17
Pinaki Karuri

Voici un article sur MSDN à propos de Quotas de lecteurs .

Il semble que l'un des quotas de lecteurs côté serveur soit dépassé. 

Plus précisément, maxStringContentLength est dépassé. La valeur par défaut est 8192 caractères pour maxStringContentLength qui, comme décrit dans le message d'erreur, est dépassé.

Mais ce n'est peut-être pas la meilleure approche pour simplement augmenter toutes les valeurs au maximum 2147483647 comme l'ont suggéré d'autres.

Comme indiqué dans la documentation MSDN que j'ai liée:

Les contraintes de complexité offrent une protection contre le déni de service (DOS) attaques qui tentent d’utiliser la complexité du message pour lier ressources de traitement des points finaux. Les autres contraintes de complexité incluent des éléments tels qu'une profondeur d'élément maximale et une longueur maximale pour la chaîne contenu dans le message.

Couplé au fait que vous avez actuellement Mode de sécurité défini sur Aucun - vous êtes peut-être en train de vous préparer à certains problèmes.

10
Derek W

J'ai eu cette erreur et résoudre en ajoutant ceci - propriété MaxItemsInObjectGraph pour le service à la fois dans la configuration du client et du serveur.

<dataContractSerializer maxItemsInObjectGraph="2147483647" />

du côté serveur

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

Côté client

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

et n'oubliez pas d'appliquer ce comportement à EndPoint behaviorConfiguration = "endpointbehaviour"

8
Lingaraj

Reliure côté 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>

Fichier de configuration de service:

<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
Ravi Kumar Kamboj

Pinaki Karuri,

la longueur des quotas dépend non seulement de la configuration du client, mais également de celle du serveur. Veuillez poster le fichier web.config de votre serveur WCF afin que nous puissions éclaircir le problème. Il y a une probabilité que vous ayez déjà défini le quota pour 8192. Le moyen le plus rapide pour vous serait donc de trouver et d'augmenter sa valeur.

Mettre à jour

Autant que je sache, il vous manque le nœud 'readerQuotas' dans le fichier web.config de votre serveur. Par conséquent, la valeur de MaxStringContentLength est définie sur la valeur par défaut (8192). Veuillez vous référer à ce lien pour plus d'informations: http://msdn.Microsoft.com/en-us/library/system.xml.xmldictionaryreaderquotas.maxstringcontentlength.aspx

5
Piotr Justyna

Essayez de définir les éléments suivants dans les liaisons.

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

Cela a résolu mon problème. Pour plus de références, voir le lien suivant http://blogfornet.com/2013/08/the-maximum-string-content-length-quota-8192-has-been-expeded-while_reading-xml-data/

4
Rajkiran Sanchaniya

Vérifiez que votre infrastructure cible pour le client est la même que celle du service. J'ai eu ce problème et essayé tous les correctifs ci-dessus, mais cela n'a pas fonctionné. Propriétés vérifiées et cadre cible sélectionné et modifié.

0
Luigi