WCF - La quota conteggio dei caratteri NameTable massimo (16384) è stato superato durante la lettura dei dati XML

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

Domanda

Ho un servizio WCF che utilizza wsHttpBinding. La configurazione del server è la seguente:

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

Al lato client che sto compreso il riferimento al servizio della WCF-Service. E le grandi opere se ho limitato le funzioni dicono 90 Funzionamento contratto nel mio IService ma se aggiungere un altro OperationContract di quanto io sono in grado di aggiornare il riferimento al servizio, né sono in grado di aggiungere che il servizio di riferimento. In questo articolo è detto che cambiando quelli config file (cioè Devenv.exe.config, WcfTestClient.exe.config e SvcUtil.exe.config) che funzionerà, ma anche tra questi attacchi in quei file di configurazione che si apre ancora di errore dicendo

Si è verificato un errore di scaricamento ' http://10.0.3.112/MyService/Service1.svc/ mex '. La richiesta non riuscita con stato HTTP 400: Bad Request. Metadati contiene un riferimento che non può essere risolta: ' http://10.0.3.112/MyService/Service1.svc / mex '. C'è un errore nel documento XML (1, 89549). La quota conteggio dei caratteri NameTable massimo (16384) è stato superato durante la lettura dei dati XML. Il NameTable è una struttura dati utilizzata per memorizzare le stringhe incontrati durante l'elaborazione XML - I documenti XML a lungo con i non-ripetizione nomi di elementi, i nomi degli attributi e dei valori degli attributi possono scatenare questa quota. Questo contingente può essere aumentato modificando la proprietà MaxNameTableCharCount sulle XmlDictionaryReaderQuotas utilizzato durante la creazione del lettore XML. Linea 1, la posizione 89549. Se il servizio è definita nella soluzione corrente, provare a costruire la soluzione e l'aggiunta di nuovo il riferimento al servizio.

Qualsiasi idea di come risolvere questo ????

È stato utile?

Soluzione

Prova il seguente:

Nella directory di installazione di Visual Studio in cui si trova devenv.exe (ad esempio C: \ Programmi \ Microsoft Visual Studio 9.0 \ Common7 \ IDE) aggiungere questa sezione al 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>

nel app.config della WCF-service aggiungere lo stesso binding:

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

Nota che l'attributo name dei tag di legame dei due file deve corrispondere (ad esempio largeServiceBinding)

Infine aggiungere il seguente endpoint mex nel tag di servizio:

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

questo può apparire come segue:

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

Altri suggerimenti

Lo so che è stato un po ', ma ho avuto lo stesso problema e ha trovato altra soluzione (più semplice) in CodeProject

Nella soluzione data lì i valori sono impostati nel codice anziché il file 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);

Tuttavia, ho cambiato i valori nei valori rilevanti nel file .config (sia nel <binding> e le sezioni <readerQuotas>) e ha risolto il problema (piuttosto che aggiungere associazioni personalizzate):

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

Spero che questo possa aiutare qualcuno:)

Una cosa da riconoscere è che il messaggio si riferisce alle quote non lettore svcutil quelli di servizio! Svcutil ha un limite su quanto metadati si può leggere. Questo limite può essere modificato con un file di configurazione. La soluzione è quella di creare un file di configurazione per lo svcutil e metterlo nella stessa cartella come lo strumento. La prossima volta che si esegue svcutil, saranno presi in considerazione i valori del file di configurazione.

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

nel vostro app.config o dll.config sul client add:

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

E ci si va! Questa è una delle cose davvero fastidioso con WCF e, come spesso Google ha appena ti dà un sacco di bs. tonnellate di tempo sprecato con questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top