WCF - Le quota de nombre de caractères NameTable maximale (16384) a été dépassée lors de la lecture des données XML

StackOverflow https://stackoverflow.com/questions/2765598

Question

Je vais avoir un service WCF qui utilise wsHttpBinding. La configuration du serveur est la suivante:

<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é du client, je suis la référence de service de la WCF-Service. Il fonctionne très bien si j'ai des fonctions limitées que 90 Contrat d'exploitation dans mon IService mais si ajouter un OperationContract que je ne parviens pas à mettre à jour le service de référence, ni je suis en mesure d'ajouter que la référence de service. Dans cet article il est mentionné que, en changeant les config fichiers (c.-à-devenv.exe.config, WcfTestClient.exe.config et SvcUtil.exe.config), il fonctionne, mais même y compris les liaisons dans les fichiers de configuration encore que pops d'erreur en disant

Il y avait un téléchargement d'erreur « http://10.0.3.112/MyService/Service1.svc/ MEX. La demande a échoué avec l'état HTTP 400: Bad Request. Les métadonnées contiennent une référence qui ne peut être résolu: « http://10.0.3.112/MyService/Service1.svc / MEX. Il y a une erreur dans le document XML (1, 89549). Le quota de nombre de caractères NameTable maximale (16384) a été dépassée lors de la lecture des données XML. Le NameTable est une structure de données utilisée pour stocker des chaînes survenant pendant le traitement XML - des documents XML avec de longs noms d'éléments non-répétition, noms d'attributs et les valeurs d'attribut peut déclencher ce quota. Ce quota peut être augmentée en modifiant la propriété MaxNameTableCharCount sur les XmlDictionaryReaderQuotas objets utilisés lors de la création du lecteur XML. Ligne 1, 89549. Si le service est défini dans la solution actuelle, essayer de construire la solution et en ajoutant à nouveau la référence de service.

Toute idée comment résoudre ce ????

Était-ce utile?

La solution

Essayez ce qui suit:

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 reliure:

<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 name des balises de liaison des deux fichiers doit correspondre (par exemple largeServiceBinding)

Enfin ajouter le paramètre suivant dans votre MEX é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>

Autres conseils

Je sais que cela a été un certain temps, mais je suis arrivé le même problème et a trouvé une autre solution (simple) dans CodeProject

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, je change les valeurs des valeurs pertinentes dans le fichier .config (tant dans le <binding> et les sections de <readerQuotas>) et a 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 aide quelqu'un:)

Une chose est de reconnaître que le message fait référence aux quotas de lecteur de svcutil pas les ones de service! Svcutil a une limite sur la quantité de métadonnées 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 placez-le dans le même dossier que l'outil. La prochaine fois que vous exécutez svcutil, les valeurs du fichier de configuration sera prise en compte.

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

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

<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 là vous allez! Ceci est l'une des choses vraiment ennuyeux avec WCF et comme google souvent juste vous donne beaucoup de bs. Gaspillée tonnes de temps avec cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top