WCF - La cuota recuento de caracteres NameTable máximo (16384) se ha superado durante la lectura de datos XML

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

Pregunta

Estoy teniendo un servicio WCF que utiliza wsHttpBinding. La configuración del servidor es como sigue:

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

En el lado del cliente Estoy incluyendo la referencia de servicio del Servicio de WCF. Funciona muy bien si me he limitado funciones dicen 90 Operación Contrato en mi IService pero si añadir una OperationContract más de lo que soy capaz de actualizar la referencia de servicio, ni soy capaz de añadir que la referencia de servicio. En este artículo se menciona que al cambiar los config archivos (es decir Devenv.exe.config, WcfTestClient.exe.config y SvcUtil.exe.config) que funciona, pero aun incluyendo aquellas fijaciones en los archivos de configuración fija que los estallidos de error diciendo

Se ha producido un error de descarga ' http://10.0.3.112/MyService/Service1.svc/ Mex '. La solicitud con el estado HTTP 400: Solicitud incorrecta. Metadatos contiene una referencia que no pueda ser resuelto: ' http://10.0.3.112/MyService/Service1.svc / Mex '. Hay un error en el documento XML (1, 89549). La cuota de la cuenta de carácter NameTable máximo (16384) se ha superado durante la lectura de datos XML. El NameTable es una estructura de datos utilizada para almacenar cadenas encontradas durante el procesamiento de XML - documentos XML con largas no se repiten los nombres de elementos, los nombres de atributos y valores de atributos pueden desencadenar esta cuota. Esta cuota se puede aumentar cambiando la propiedad MaxNameTableCharCount en los XmlDictionaryReaderQuotas objeto que se utiliza cuando se crea el lector XML. Línea 1, posición 89.549. Si el servicio se define en la solución actual, intentar construir la solución y añadiendo la referencia de servicio de nuevo.

¿Alguna idea de cómo resolver este ????

¿Fue útil?

Solución

Trate lo siguiente:

En el directorio de instalación de Visual Studio, donde se encuentra devenv.exe (por ejemplo, C: \ Archivos de programa \ Microsoft Visual Studio 9.0 \ Common7 \ IDE) añadir esta sección para el 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>

en el app.config de la WCF servicio de añadir la misma unión:

<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 que el atributo de nombre de las etiquetas de unión de los dos archivos debe coincidir (por ejemplo largeServiceBinding)

Por último añadir el siguiente punto final mex en la etiqueta de servicio:

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

esto puede tener este aspecto:

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

Otros consejos

Sé que ha pasado mucho tiempo, pero tengo el mismo problema y ha encontrado otra solución (simple) en CodeProject

En la solución dada allí los valores se encuentran en el código en lugar de en el archivo .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);

Sin embargo, he cambiado los valores en los valores correspondientes en el archivo .config (tanto en el <binding> y las secciones <readerQuotas>) y resolvió el problema (en lugar de añadir enlaces de encargo):

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

Espero que esto ayuda a alguien:)

Una cosa que hay que reconocer es que el mensaje no se refiere a las cuotas de lectores svcutil los más servicios! Svcutil tiene un límite en la cantidad de metadatos que puede leer. Este límite se puede cambiar con un archivo de configuración. La solución es crear un archivo de configuración para svcutil y colocarlo en la misma carpeta que la herramienta. La próxima vez que ejecute svcutil, se tendrá en cuenta los valores de configuración de archivos.

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

en su app.config o dll.config en el complemento de cliente:

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

Y hay que ir! Esta es una de las cosas realmente molesto con WCF y tan a menudo Google sólo se produce una gran cantidad de ancho. toneladas de pérdidas de tiempo con esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top