none
Problemas al recibir grandes cantidades de datos de un servicio ¡a menos que se devuelva un Dataset! RRS feed

  • Pregunta

  • Hola

    Escenario: Tengo un servicio que devuelve una gran cantidad de datos, por ejemplo 26000 registros. Si en lugar de usar un WCF uso un web service el servicio devuelve los 26000 registros sin problemas, pero si uso un WCF del tipo basicHttpBinding da un error (más adelante pongo el error). Ahora bien, si el servicio en lugar de devolver una lista "List<>" del objeto que ocupo devuelve un DataSet si funciona.

    Entonces, en resumen.

    mismo programa expuesto como un web service=OK,

    mismo programa expuesto como wcf devolviendo una lista List<> de objetos =error,

    Mismo programa expuesto como wcf devolviendo un DataSet = Ok

    Originalmente creí que era un problema de la configuración de los endpoints y del tamaño asignado en los readerQuotas, pero ese no es el caso, ya que si devulvo un DataSet si se retornan todos los datos.

    También creí que podría ser un problema de data, y serialización de la respuesta, pero si devuelvo una lista (list<>) de obtjetos en un web service sencillosi funciona, entonces descarté serialización.

    ¿Alguién tiene alguna idea de que podría estar provocando este comportamiento?

    Adjunto el error:

    Error al recibir la respuesta HTTP a http://xxx/WCFServicio.svc. Puede deberse a que el enlace del extremo de servicio no usa el protocolo HTTP. También puede deberse a que el servidor anula un contexto de solicitud HTTP (posiblemente por el cierre del servicio). Consulte los registros del servidor para obtener más información.


    Nattanahel Chaves
    miércoles, 16 de junio de 2010 21:36

Respuestas

  • Nattanahel,

    En el cliente, ¿agregas el servicio como referencia? ¿o estas creando una clase con svcutil? ¿o como lo agregas para consumirlo?. Ya sea que lo estes agregando como referencia de servicio o hayas creado una clase con svcutil.exe debes tomar en cuenta que el tipo predeterminado para arreglos es array. Entonces si tu tipo de retorno de algun metodo del servicio es List<T>, lo que el servicio hace es convertir tu List<T> a un Array<T> lo que pudiera estar causando el problema. La solucion es que modifiques el tipo default para arreglos, si estas agregando como referencia de servicio dale click en el boton de avanzado de la ventana y ahi elige List. Si estas creando via svcutil.exe entonces el comando debe lucir asi:

    svcutil.exe http://localhost/Services/Servicio.svc?wsdl /ct:System.Collections.Generic.List`1

    Prueba con esto y cuentame como te ha ido.

     

    Saludos!

    viernes, 18 de junio de 2010 16:22

Todas las respuestas

  • Nattanahel,

    En el cliente, ¿agregas el servicio como referencia? ¿o estas creando una clase con svcutil? ¿o como lo agregas para consumirlo?. Ya sea que lo estes agregando como referencia de servicio o hayas creado una clase con svcutil.exe debes tomar en cuenta que el tipo predeterminado para arreglos es array. Entonces si tu tipo de retorno de algun metodo del servicio es List<T>, lo que el servicio hace es convertir tu List<T> a un Array<T> lo que pudiera estar causando el problema. La solucion es que modifiques el tipo default para arreglos, si estas agregando como referencia de servicio dale click en el boton de avanzado de la ventana y ahi elige List. Si estas creando via svcutil.exe entonces el comando debe lucir asi:

    svcutil.exe http://localhost/Services/Servicio.svc?wsdl /ct:System.Collections.Generic.List`1

    Prueba con esto y cuentame como te ha ido.

     

    Saludos!

    viernes, 18 de junio de 2010 16:22
  • Buenas.

    Gracias por la ayuda, pero la referencia está creada con la opción de System.Collection.Generic.List, pero igual presenta el problema.


    Nattanahel Chaves
    jueves, 22 de julio de 2010 19:35
  • Hola, tenia el mismo problema al intentar descargar List o array con muchos rows, logre resolverlo modificando una configuración que por default  no viene

    <behaviors>

    <serviceBehaviors>
    <behavior name="If.Servicio.Service1Behavior">
              <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    <serviceMetadata httpGetEnabled="true"/>
    <serviceDebug includeExceptionDetailInFaults="true"/>
              
    </behavior>
    </serviceBehaviors>
    </behaviors>

    Espero les sea de utilidad

    • Propuesto como respuesta Fermín Pitol viernes, 17 de mayo de 2013 14:58
    viernes, 15 de febrero de 2013 20:26
  • llevaba aproximadamente 2 días intentando solucionar este problema, ya había visto lo de  dataContractSerializer pero por azares lo descarte inmediatamente, sin embargo, lo probé y funcionó a la perfección . Gracias


    viernes, 17 de mayo de 2013 15:00