2010-05-04 18 views
9

J'ai un service WCF qui utilise wsHttpBinding. La configuration du serveur est la suivante:WCF - Le quota de nombre de caractères maximal autorisé (16384) a été dépassé lors de la lecture des données XML

<bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBinding" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" negotiateServiceCredential="true" 
       algorithmSuite="Default" establishSecurityContext="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

Du côté client, j'inclus la référence de service du service WCF. Cela fonctionne très bien si j'ai des fonctions limitées, disons "Contrat d'exploitation" dans mon IService mais si j'ajoute un contrat OperationContract plus que je ne peux pas mettre à jour le service, je ne peux pas ajouter cette référence de service. En this article il est mentionné qu'en changeant les fichiers de configuration (c'est-à-dire devenv.exe.config, WcfTestClient.exe.config et SvcUtil.exe.config) cela fonctionnera mais même en incluant ces liaisons dans ces fichiers de configuration encore cette erreur apparaît en disant

Une erreur s'est produite lors du téléchargement de 'http://10.0.3.112/MyService/Service1.svc/mex'. La demande a échoué avec le statut HTTP 400: Demande incorrecte. Les métadonnées contiennent une référence qui ne peut pas être résolue: 'http://10.0.3.112/MyService/Service1.svc/mex'. Une erreur est survenue dans le document XML (1, 89549). Le quota de nombre de caractères maximal autorisé (16384) a été dépassé lors de la lecture des données XML. Le nametable est une structure de données utilisée pour stocker les chaînes rencontrées lors du traitement XML - des documents XML longs avec des noms d'éléments non répétitifs, des noms d'attributs et des valeurs d'attribut peuvent déclencher ce quota. Ce quota peut être augmenté en modifiant la propriété MaxNameTableCharCount sur l'objet XmlDictionaryReaderQuotas utilisé lors de la création du lecteur XML. Ligne 1, position 89549. Si le service est défini dans la solution actuelle, essayez de créer la solution et d'ajouter à nouveau la référence de service.

Une idée comment résoudre ceci ????

Répondre

11

les opérations suivantes:

Dans le répertoire d'installation de votre Visual Studio où est situé devenv.exe (par exemple C: \ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE) ajouter cette section à la devenv. exe.cofig

<system.serviceModel> 
<client> 
    <endpoint binding="customBinding" bindingConfiguration="largeServiceBinding" contract="IMetadataExchange" name="http" /> 
</client> 

<bindings> 
    <customBinding> 
    <!-- NOTE: The binding name must be the same as specified in the config file of the wcf service --> 
    <binding name="largeServiceBinding" > 
     <textMessageEncoding> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     </textMessageEncoding> 

     <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/> 
    </binding> 

    </customBinding> 
</bindings> 
</system.serviceModel> 

dans le app.config de votre service WCF ajouter la même liaison:

<bindings> 
    <customBinding > 
    <!-- NOTE: The binding name must be the same as specified in the devenv.exe.config file located ..\Common7\IDE folder of the VS installation directory --> 
    <binding name="largeServiceBinding" > 
     <textMessageEncoding> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
     </textMessageEncoding> 
     <httpTransport transferMode="Buffered" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647"/> 
    </binding> 
    </customBinding> 
</bindings> 

Notez que l'attribut de nom des étiquettes de liaison des deux fichiers doit correspondre à (par ex. largeServiceBinding)

Enfin ajouter le point de terminaison MEX suivant dans votre étiquette de service:

<endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/> 

cela peut ressembler à ceci:

<services> 
    <service behaviorConfiguration="MyServiceBehavior" 
    name="MyService.MyService"> 
    <endpoint address="" binding="wsHttpBinding" contract="MyService.IMyService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="customBinding" contract="IMetadataExchange" bindingName="testBinding" bindingConfiguration="largeServiceBinding" name="http"/> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost:8731/Design_Time_Addresses/MyService/MyService/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
+0

Merci pour la réponse va essayer et vous faire savoir le résultat. – Jankhana

+0

Cela a fonctionné Merci. J'ai dû changer dans le client les paramètres de points finaux de service après que cela a fonctionné. Merci!!!! – Jankhana

+0

cela a également fonctionné pour moi, mais il n'y avait pas besoin d'ajouter une nouvelle liaison je viens de mettre à jour le 'readerQuotas' avec ce qui précède. – endyourif

1

Une chose à reconnaître est que le message fait référence au lecteur de svcutil les quotas pas les services! Svcutil a une limite sur combien de métadonnées il peut lire. Cette limite peut être modifiée avec un fichier de configuration. La solution est de créer un fichier de configuration pour svcutil et de le placer dans le même dossier que l'outil. La prochaine fois que vous lancerez svcutil, les valeurs du fichier de configuration seront prises en compte.

http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx

1

dans votre app.config ou dll.config sur le client ajouter:

<configuration> 
<system.serviceModel> 
<bindings> 
<netTcpBinding> 
<binding name="myMex" maxReceivedMessageSize="1024000"> <!-- modify this to avoid stupid error --> 
<readerQuotas maxNameTableCharCount="163840" /> <!-- DO NOT touch this one --> 
<security mode="None" /> 
</binding> 
</netTcpBinding> 
</bindings> 

... 

<client> 
<endpoint binding="netTcpBinding" bindingConfiguration="myMex" 
contract="IMetadataExchange" name="net.tcp" /> 

... 

     </client> 
    </system.serviceModel> 
</configuration> 

Et voilà! Ceci est l'une des choses vraiment ennuyeuses avec WCF et comme souvent, Google vous cède beaucoup de bs. Gâché des tonnes de temps avec ça.

4

Je sais que cela a été un certain temps, mais je m'y suis le même problème et trouvé une autre solution in codeproject

(simple) Dans la solution donnée il y a les valeurs sont définies dans le code plutôt que le fichier .config.

 BasicHttpBinding binding = new BasicHttpBinding(); 
     binding.Security.Mode = BasicHttpSecurityMode.Transport; 
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
     binding.MaxReceivedMessageSize = 50000000; 
     binding.ReaderQuotas.MaxArrayLength = 50000000; 
     binding.ReaderQuotas.MaxStringContentLength = 50000000; 
     binding.ReaderQuotas.MaxNameTableCharCount = 50000000; 
     EndpointAddress endpoint = new EndpointAddress(new Uri("https://server/EWS/Exchange.asmx")); 
     ExchangeServicePortTypeClient ews = new ExchangeServicePortTypeClient(binding, endpoint); 

Cependant, j'ai changé les valeurs dans les valeurs correspondantes dans le fichier .config (tant dans le <binding> et les <readerQuotas> sections) et résolu le problème (plutôt que d'ajouter des liaisons personnalisées):

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

J'espère que cela aidera quelqu'un :)