2013-08-14 40 views
5

Ho appena aumentato il numero di metodi nel mio ServiceContract. quando aggiorno il riferimento al servizio in Visual Studio ottengo il messaggio:È stata superata la quota massima consentita per il numero di caratteri (16384)

Metadati contiene un riferimento che non può essere risolta: 'net.tcp: //xxxxx.com: 8002/DataQueryService/mex'.

C'è un errore nel documento XML.

La quota massima del numero identificabile quota di conteggio (16384) è stata superata durante la lettura dei dati XML. nametable è una struttura di dati utilizzata per memorizzare le stringhe rilevate durante l'elaborazione XML - i documenti XML lunghi con nomi di elementi non ripetuti, i valori degli attributi e i valori degli attributi possono attivare questa quota. Questa quota può essere aumentata modificando la proprietà MaxNameTableCharCount sull'oggetto XmlDictionaryReaderQuotas utilizzato durante la creazione del lettore XML .

La configurazione lato server originale era:

<services> 
     <service behaviorConfiguration="XXXXX.DataQueryService.ServiceBehavior" name="XXXXX.DataQueryService.QueryService"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://xxxxx.com:8002/DataQueryService" /> 
      </baseAddresses> 
     </host> 
     <endpoint name="MexEndpoint" address="mex" binding="customBinding" bindingConfiguration="unsecureTcpMex" contract="IMetadataExchange" /> 
    </service> 
</services> 

<bindings> 
    <customBinding> 
     <binding name="unsecureTcpMex"> 
      <tcpTransport portSharingEnabled="True" /> 
     </binding> 
    </customBinding>  
</bindings> 

che ho modificato a:

<bindings> 
    <customBinding> 
     <binding name="unsecureTcpMex"> 
      <textMessageEncoding> 
       <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      </textMessageEncoding> 
      <tcpTransport portSharingEnabled="True" maxReceivedMessageSize="2147483647" /> 
     </binding> 
    </customBinding>  
</bindings> 

Quali altri cambiamenti devo fare al mio config per ottenere questo lavoro?

Aggiornamento Seguendo il consiglio di @ Chris ho provato ad aggiornare il file di configurazione per SVCUtil. Ho aggiunto un nome al mio endpoint in modo che corrispondesse (aggiornato sopra). Lo SvcUtil.config è ora la seguente:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <customBinding> 
       <binding name="unsecureTcpMex"> 
        <textMessageEncoding> 
         <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
        </textMessageEncoding> 
        <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
       </binding> 
      </customBinding> 
     </bindings> 
     <client> 
      <endpoint binding="customBinding" bindingConfiguration="unsecureTcpMex" 
       contract="IMetadataExchange" 
       name="MexEndpoint" /> 
     </client> 
    </system.serviceModel> 
</configuration> 
+0

Forse i vostri messaggi sono semplicemente troppo grandi o costituiti da troppi elementi XML/attributi? –

+0

È il numero di contratti operativi che è aumentato. Questo sta causando il problema. – openshac

+0

Quale versione di WCF stai lavorando con (entrambi i lati)? – ranieuwe

risposta

0

Questo dovrebbe aiutare: http://geekswithblogs.net/claraoscura/archive/2007/08/20/114806.aspx sembra che la soluzione è quella di creare un file di configurazione per lo svcutil e posizionarlo nella stessa cartella di esso.

+0

grazie per quello. Ho aggiunto un file di configurazione per SvcUtil.exe che ho dettagliato sopra. Tuttavia sto ancora ricevendo lo stesso errore. Era solo il file SvcUtil che ho bisogno di cambiare o era anche il lato server? – openshac

+0

È necessario modificare solo l'applicazione che consuma – ranieuwe

+0

OK, ho provato a modificare il file di configurazione per SvcUtil (come sopra) ma non funziona ancora. – openshac

1

Non credo che sia pratico suddividere le operazioni in più contratti? Ti dispiace se ti chiedo di quante operazioni di servizio stiamo parlando?

Hai provato le soluzioni in questo post? http://social.msdn.microsoft.com/Forums/vstudio/en-US/17592561-c470-452a-a52c-2a5a2839582c/metadataexchangeclient-and-nametable-character-count-quota

Tra le altre proposte utilizzano il protocollo Discovery per leggere i metadati, che non ha nessun quote lettore: http://msdn2.microsoft.com/en-us/library/system.web.services.discovery.discoveryclientprotocol.aspx

La soluzione alla parte inferiore suggerisce di modificare le quote lettore predefinito in codice prima di iniziare il servizio . Credo che questo dovrebbe essere fatto in una fabbrica di ServiceHost personalizzata. Per favore fatemi sapere se vorreste essere d'aiuto.

Spero che questo aiuti.

+0

Grazie, avevo già visto il primo link che hai dato. La nostra soluzione è probabilmente già troppo matura per modificare il metodo di rilevamento come suggerito. Ho visto che altre persone hanno avuto successo cambiando il lettore, quindi mi piacerebbe fare lo stesso. Significa che sono solo un paio di righe che cambiano nei file di configurazione. Quando dici "in una fabbrica di ServiceHost personalizzata", cosa intendi con questo? Non è possibile fare nei file di configurazione? – openshac

+0

Questa pagina descrive come creare un host del servizio personalizzato per eseguire alcune configurazioni personalizzate del servizio, oltre a leggere i file di configurazione, incluso come utilizzare IIS. http://msdn.microsoft.com/en-us/library/aa395224.aspx Ciò ti consentirà di impostare le quote dei lettori prima che il servizio venga creato, che credo sia la fonte del tuo problema e perché non possa essere fatto solo nei file di configurazione. In bocca al lupo! – AFischbein

+0

Ho ragione nel ritenere che i riferimenti a SvcUtil.exe e Visual Studios Service non funzionino ancora con questa soluzione. Il nostro processo di compilazione è automatizzato e in realtà è anche la build che sta fallendo, quindi ho bisogno di trovare una soluzione in cui posso semplicemente modificare il file di configurazione. Un certo numero di altre persone è riuscito a superare questo problema modificando il file di configurazione sul lato client. Sto solo cercando di scoprire quali errori ho nel mio file di configurazione. – openshac

0

impostare il nuovo valore per la proprietà a livello di codice MaxNameTableCharCount Prova:

Binding binding = endpoint.Binding; 

XmlDictionaryReaderQuotas myReaderQuotas = new XmlDictionaryReaderQuotas(); 
myReaderQuotas.MaxStringContentLength = something; 
myReaderQuotas.MaxArrayLength = something; 
myReaderQuotas.MaxBytesPerRead = something; 
myReaderQuotas.MaxDepth = something; 
myReaderQuotas.MaxNameTableCharCount = something; 

binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, myReaderQuotas, null); 

Nota: è necessario impostare prima del proxy client e/o il servizio di accoglienza vengono creati. Una volta creati, non possono essere modificati.

+0

Il nostro processo di compilazione è automatizzato e in realtà è anche la build che sta fallendo, quindi ho bisogno di trovare una soluzione in cui posso semplicemente modificare il file di configurazione. Un certo numero di altre persone è riuscito a superare questo problema modificando il file di configurazione sul lato client. Sto solo cercando di scoprire quali errori ho nel mio file di configurazione. – openshac

+0

Il messaggio di errore continua a indicare: "La quota massima di conteggio caratteri nominabili (16384)". Ho detto di provarlo perché non sembra che stia leggendo il tuo nuovo valore per quello (16384 invece del tuo 2147483647). Una volta ho avuto un problema simile ma cambiarlo dal file di configurazione non funzionava, ma funzionava in fase di esecuzione. –

+0

Sì, il messaggio di errore è sempre lo stesso. Il modo in cui è stato impostato il nostro script di build Ho bisogno di specificare il valore nel file di configurazione. Ha funzionato per altri utenti cambiando la configurazione. C'è qualche ragione per cui non funziona per me? – openshac

3
<binding name="NameSoap" 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="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="1638400" /> 
    <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
</binding> 

Date un'occhiata a questa linea: maxNameTableCharCount = "1.638.400"

+0

Grazie Bart, ma ho già aumentato tale valore dal suo valore predefinito di 16384 al valore massimo per un numero intero - 2147483647. – openshac

Problemi correlati