none
Problema al traer imagen desde sql por webservice asmx RRS feed

  • Pregunta

  • Saludos,

    estoy tratando de traer una imagen por un servicio web asmx, esto es lo que tengo:

    un campo varbynary en sql y un procedure que trae estos datos por el web service, cuando ejecuto el webservice desde el navegador funciona bien. y veo el campo imagen en base64. el problema esta en el momento que la aplicación hace el requets da un error con el mensaje FormatException y el stack trace es el siguiente 

     at System.Convert.FromBase64CharArrayHelper(Char* pCharArray, Int32 offset, Int32 length)

       at System.Convert.FromBase64String(String s)

       at System.Data.Common.ObjectStorage.ConvertXmlToObject(String s)

       at System.Data.DataColumn.ConvertXmlToObject(String s)

       at System.Data.XmlDataLoader.LoadColumn(DataColumn column, Object[] foundColumns)

       at System.Data.XmlDataLoader.LoadTable(DataTable table, Boolean isNested)

       at System.Data.XmlDataLoader.LoadData(XmlReader reader)

       at System.Data.DataTable.ReadXmlDiffgram(XmlReader reader)

       at System.Data.DataTable.ReadXml(XmlReader reader, XmlReadMode mode, Boolean denyResolving)

       at System.Data.DataTable.ReadXmlSerializable(XmlReader reader)

       at System.Data.DataTable.System.Xml.Serialization.IXmlSerializable.ReadXml(XmlReader reader)

       at System.Xml.Serialization.XmlSerializationReader.DeserializeSerializableElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue)

       at System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget)

       at System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement)

       at System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget)

       at System.Xml.Serialization.XmlSerializationReader.DeserializeComplexElement(LogicalType deserializeAs, Accessor accessor, Fixup fixup, Object fixupTarget, String identifier, Boolean emptyValue, Boolean nullValue)

       at System.Xml.Serialization.XmlSerializationReader.deserializeElement(Accessor accessor, Fixup fixup, Object fixupTarget)

       at System.Xml.Serialization.XmlSerializationReader.DeserializeElementMember(MemberValueCollection members, Object fixupTarget, Hashtable internalState, Boolean& firstElement)

       at System.Xml.Serialization.XmlSerializationReader.deserializeMembers(MemberValueCollection members, Object fixupTarget)

       at System.Web.Services.Protocols.SoapMessageParser.execute()

       at System.Web.Services.Protocols.SoapMessageSerializer.Deserialize(XmlReader reader, SoapHttpClientProtocol client, LogicalSoapMethod soapMethod, Boolean soap12)

       at System.Web.Services.Protocols.SoapHttpClientProtocol.doInvoke(String methodName, Object[] parameters, WebClientAsyncResult asyncResult)

       at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)

       at E_WarehouseCompac.EWarehouseWs.EWarehouseWs.MobileGetProductos(Int32 codigoProducto, Int32 cliente)


    Live like you'll die tomorrow, learn like you'll live forever. Blog
    lunes, 30 de mayo de 2011 15:53

Respuestas

Todas las respuestas

  • hola

    que tipo de dato retornas en el web service ? es un string con el xml

    estas cargando ese xml en un XmlDocument ?

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 30 de mayo de 2011 16:00
  • Si retorno el string con el xml , que trae de siempre

    y consumo el webservice atraves del proxy que el mismo visual studio crea

    la estructura de cada registro es la siguiente: 

    - <xs:sequence>
    <xs:element name="CODIGO_PRODUCTO" type="xs:decimal" minOccurs="0" />
    <xs:element name="DESCRIPCION" type="xs:string" minOccurs="0" />
    <xs:element name="CODIGO_ALFANUMERICO" type="xs:string" minOccurs="0" />
    <xs:element name="CODIGO_BARRA" type="xs:string" minOccurs="0" />
    <xs:element name="CODIGO_REFERENCIA" type="xs:string" minOccurs="0" />
    <xs:element name="CODIGO_CLIENTE" type="xs:string" minOccurs="0" />
    <xs:element name="CODIGO_SUPLIDOR" type="xs:string" minOccurs="0" />
    <xs:element name="OTRO_CODIGO" type="xs:string" minOccurs="0" />
    <xs:element name="OTRO_ID" type="xs:int" minOccurs="0" />
    <xs:element name="IMAGEN" type="xs:base64Binary" minOccurs="0" />
    <xs:element name="PESO" type="xs:decimal" minOccurs="0" />
    <xs:element name="FECCAM" type="xs:dateTime" minOccurs="0" />
    <xs:element name="HORCAM" type="xs:dateTime" minOccurs="0" />
    <xs:element name="USRCAM" type="xs:string" minOccurs="0" />
    <xs:element name="ESTCAM" type="xs:string" minOccurs="0" />
    </xs:sequence>
    
     de cada registro 

     

     - <tabla diffgr:id="tabla1" msdata:rowOrder="0">
    <CODIGO_PRODUCTO>1438</CODIGO_PRODUCTO>
    <DESCRIPCION>D/C Servilletero Bacardi</DESCRIPCION>
    <CODIGO_ALFANUMERICO xml:space="preserve"></CODIGO_ALFANUMERICO>
    <CODIGO_BARRA xml:space="preserve"></CODIGO_BARRA>
    <CODIGO_REFERENCIA xml:space="preserve"></CODIGO_REFERENCIA>
    <CODIGO_CLIENTE>9</CODIGO_CLIENTE>
    <CODIGO_SUPLIDOR xml:space="preserve"></CODIGO_SUPLIDOR>
    <OTRO_CODIGO />
    <OTRO_ID>0</OTRO_ID><IMAGEN></IMAGEN
    <PESO>0.00000</PESO>
    <FECCAM>2011-05-24T00:00:00-04:00</FECCAM>
    <HORCAM>1900-01-01T11:22:37-04:00</HORCAM>
    <USRCAM>equezada</USRCAM>
    <ESTCAM>A</ESTCAM>
    </tabla>
    
    nota tuve que quitar el valor de IMAGEN, el foro me dice que no puedo poner mensajes de mas de 60Mil caracteres

     


    Live like you'll die tomorrow, learn like you'll live forever. Blog
    lunes, 30 de mayo de 2011 16:19
  • la respuesta del web service la asignas a un string ? o lo haces directo a un XmlDocument

    o algun otro objeto que que parsea el xml

     

    a donde apunto es a saber si el problema se genera dentro del servicio o es cuando trabajs con la informacion recibida

    porque si el problema se da al parsear, se ve que algo no le gusta del xml

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 30 de mayo de 2011 16:26
  • Es al parcear dentro del mismo web service, ya estoy seguro , pero no se que es lo que no le gusta

    y se que es el campo IMAGEN por que si lo quito todo funciona de maravillas, pero con el no, no se si hay que ponerl algo mas para que sepa como parcear el campo en base64 a imagen sin problemas

     


    Live like you'll die tomorrow, learn like you'll live forever. Blog
    lunes, 30 de mayo de 2011 16:29
  • no has probado serilizar a xml una clase y que esta tenga la propiedad del tipo byte[] que presente la imagen

    entonces si serialziar dejas que esta aplique el formato que necesita

    public class datos{

      //el resto de las propiedade

      public byte[] Imagen {get; set;}

    }

    la idea es no convertirlo explicitamente

    es mas podrias retornar directo la clase sin serialziar a xml que lo haga sola, asi puedes tomar el tipo en el proxy y envias informacion tipada no en string


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 30 de mayo de 2011 16:40
  • eso es lo que hago, el problema viene al momento de traer la informacion, mucho antes que pueda iterar por un datatable que es lo que el método devuelve 
    Live like you'll die tomorrow, learn like you'll live forever. Blog
    lunes, 30 de mayo de 2011 20:17
  • pero si esto es asi entocnes no necesitas convertir a Base64

    ya qeu asigbas directo el campo del tipo byte[] a la propeidad de la clase de foam directa la devuelve como resultado

    como es que asignas la info del datatable al campo byte[] de la imagen, no has evalaudo suar un DataReader ?

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 30 de mayo de 2011 20:30
  • jeje sip , ia se aun no me cojes la idea.. el erro no esta en mi codigo, si no en el proxy que genera vs2008

    esta entre el reply de webservice y el proxy el problema


    Live like you'll die tomorrow, learn like you'll live forever. Blog
    lunes, 30 de mayo de 2011 20:31
  • pero luego de apcliar actualziaciones en el web service, lo has actualizado ?

    o sea has realizado algun "update" del proxy, no descarto que venga por aqui el problema, pero me parce raro

    proque como veras aqui

     

    Image Upload Web Service in C#.NET

    How to: Enable a Web Service to Send and Receive Large Amounts of Data

    un byte[] se podria enviar en els ervicio sin problemas

    intenta crear un servicio que retorne solo el byte[], sin la clase que lo encapaula a ver como se comporta

    has probado con otras imagenes por ahi algunas mas pequeña en tamaño

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 30 de mayo de 2011 22:53