2010-05-04 10 views
9

Ho un servizio WCF che utilizza wsHttpBinding. La configurazione del server è la seguente:WCF - La quota massima di conteggio dei caratteri nominabili (16384) è stata superata durante la lettura dei dati 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> 

Al lato client che sto compreso il riferimento al servizio della WCF-Service. Funziona benissimo se ho funzioni limitate, diciamo 90 Contratto operativo nel mio IService, ma se aggiungo un altro OperationContract di quanto non sia in grado di aggiornare il riferimento al servizio né sono in grado di aggiungere quel riferimento al servizio. Nell'articolo this si menziona che modificando tali file di configurazione (ad es. Devenv.exe.config, WcfTestClient.exe.config e SvcUtil.exe.config) funzionerà, ma anche includendo quei collegamenti in quei file di configurazione che appaiono ancora errore che dice

Si è verificato un errore durante il download di "http://10.0.3.112/MyService/Service1.svc/mex". Richiesta non riuscita con stato HTTP 400: Richiesta non valida. I metadati contengono un riferimento che non può essere risolto: 'http://10.0.3.112/MyService/Service1.svc/mex'. C'è un errore nel documento XML (1, 89549). La quota massima di conteggio dei caratteri (16384) nominabile è stata superata durante la lettura dei dati XML. Il nametable è una struttura di dati utilizzata per memorizzare le stringhe incontrate durante l'elaborazione XML: lunghi documenti XML con nomi di elementi non ripetibili, nomi di attributi e valori di attributi possono attivare questa quota. Questa quota può essere aumentata modificando la proprietà MaxNameTableCharCount sull'oggetto XmlDictionaryReaderQuotas utilizzato durante la creazione del lettore XML. Linea 1, posizione 89549. Se il servizio è definito nella soluzione corrente, provare a creare la soluzione e aggiungere nuovamente il riferimento del servizio.

Qualche idea su come risolvere questo problema ????

risposta

11

provare quanto segue:

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

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

Si noti che l'attributo nome dei tag di associazione dei due file deve corrispondere a (ad es. 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> 
+0

Grazie per la risposta cercheremo di farvi sapere il risultato. – Jankhana

+0

Ha funzionato Grazie. Ho dovuto modificare nel client le impostazioni degli endpoint del servizio dopo che ha funzionato. Grazie!!!! – Jankhana

+0

ha funzionato anche per me, ma non è stato necessario aggiungere un nuovo binding ho appena aggiornato 'readerQuotas' con quanto sopra. – endyourif

1

Una cosa da riconoscere è che il messaggio si riferisce al lettore svcutil le quote non quelle di servizio! Svcutil ha un limite sulla quantità di metadati che può leggere. Questo limite può essere modificato con un file di configurazione. La soluzione è creare un file di configurazione per svcutil e posizionarlo nella stessa cartella dello strumento. La prossima volta che si esegue svcutil, verranno presi in considerazione i valori del file di configurazione.

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

1

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

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

Ed ecco fatto! Questa è una delle cose veramente fastidiose con WCF e come spesso Google ti dà un sacco di bs. Sprecato un sacco di tempo con questo.

4

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

Nella soluzione dato 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> ei <readerQuotas> sezioni) e 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 :)

Problemi correlati