2011-05-05 36 views
5

Estoy escribiendo un servicio WCF para cargar archivos pero arroja una excepción cuando la matriz de bytes tiene más de 16384 elementos.Excepción de cuota máxima de longitud de matriz en WCF

Este es el detalle excepción:

El formateador inició una excepción mientras intentar deserializar el mensaje: Error en deserializar el cuerpo del mensaje de solicitud para la operación 'CreateDocument'. La matriz de longitud máxima (16384) se ha excedido al leer datos XML. Se puede aumentar esta cuota cambiando la propiedad MaxArrayLength en el objeto XmlDictionaryReaderQuotas usado al crear el lector XML. Línea 1, posición 22862.

La configuración para el cliente y el servidor establece la cuota máxima longitud de la matriz a 2147483647.

Client Config:

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
    <binding name="BasicHttpBinding_IDocumentLibraryService" closeTimeout="00:01:00" 
    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
    maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
    useDefaultWebProxy="true"> 
    <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
    <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
     realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
    </binding> 
    </basicHttpBinding> 
    </bindings> 
    <client> 
    <endpoint address="http://localhost:50764/DocumentLibraryService.svc" 
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDocumentLibraryService" 
    contract="DocumentLibrary.IDocumentLibraryService" name="BasicHttpBinding_IDocumentLibraryService" /> 
    </client> 

Server Config:

<bindings> 

      <basicHttpBinding> 
       <binding name="BasicHttpBinding_IDocumentLibraryService" closeTimeout="00:01:00" 
       openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
       useDefaultWebProxy="true"> 
        <readerQuotas maxDepth="2147483647" 
       maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" 
       maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 
        <security mode="None"> 
         <transport clientCredentialType="None" proxyCredentialType="None" 
         realm="" /> 
         <message clientCredentialType="UserName" algorithmSuite="Default" /> 
        </security> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 
     <services> 

      <service name="BasicHttpBinding_IDocumentLibraryService"> 

       <clear /> 
       <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" /> 
       <endpoint binding="basicHttpBinding" name="DocumentLibraryService" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" address="" 
          bindingConfiguration="BasicHttpBinding_IDocumentLibraryService"/> 
      </service> 
     </services> 

Respuesta

2

Todo lo que tenía que hacer era cambiar el nombre de servicio en el archivo web.config a nombre de servicio completo con espacio de nombres:

<service name="SampleNameSpace.DocumentLibraryService"> 

       <clear /> 
       <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" /> 
       <endpoint binding="basicHttpBinding" name="DocumentLibraryService" contract="Peninsula.DocumentLibrary.ServiceLayer.IDocumentLibraryService" address="" 
          bindingConfiguration="BasicHttpBinding_IDocumentLibraryService"/> 
      </service> 
+0

¡Esta vez 1000! Perdí 2 días de golpear mi cabeza contra una pared, tratando de descubrir qué estaba mal con mi configuración. Tenía todas las cuotas adecuadas establecidas, y aún recibía el error. ¡Gracias! – Emjay

0

Esto no es realmente una respuesta ya que su configuración parece correcta. Creo que solo necesita verificar estos valores en el código (salida para rastrear o depurar) en el host de servicio y proxy para asegurarse de que se carguen los mismos valores en config en sus canales.

En posibilidad es que se llega a otro umbral y el error es engañoso

Ahora muy encarecidamente el uso de matriz de bytes para subir archivos especialmente si utiliza XML. Estos se representarán como matrices XML y la estructura será XML enormemente hinchada, que tomará 10 veces más que el archivo original.

yo usaría:

  • WCF Streaming que trabaja con la unión básica, así y es súper rápido
  • representar alternativamente el conjunto de bytes como base 64 cadena. Esto se llevará a 33% más de espacio pero no un 1000%

ACTUALIZACIÓN

Puede rastrear el nombre del enlace que se utilizó para configurar el servicio (usarlo dentro de cualquiera de sus operaciones WCF):

public int MyServiceOperation() 
{ 
    Trace.WriteLine(OperationContext.Current.EndpointDispatcher.ChannelDispatcher.BindingName) 
.... 
+0

Gracias por su respuesta Ali Jan, Mi servicio está alojado en IIS. ¿Cómo puedo verificar estos valores en IIS? –

+0

Hice una actualización, eche un vistazo por favor. – Aliostad

Cuestiones relacionadas