2009-02-18 9 views

Respuesta

1

Puede transferir DataTable a través de un servicio web. Esa es probablemente su mejor opción, porque eso es lo que el cliente solicitó.

5

Sure. Tanto DataTable como DataSet son serializables, y también tienen funciones ReadXml() y WriteXml() que usted puede usar también.

7

Si lo expone como DataSet/DataTable, de todos modos hará su propia serialización (a través de IXmlSerializable, IIRC). Tenga en cuenta que DataSet/DataTable no constituyen buenos tipos de datos en servicios web si desea que el servicio sea portátil para otras patforms (es decir, un cliente Java, etc.). Pero puede simplemente exponerlo como tal si lo desea ...; .NET se ocupará de la traducción.

+5

Asegúrate de configurar TableName, o se producirá un error al serializar. – tsilb

7

Ver this post por Richard Blewett por razones por las que probablemente no desee hacer esto.

EDIT: Para resumir lo anterior:

  • Usando DataSet no es interoperable. Utiliza anotaciones que solo tienen sentido cuando cada extremo del enlace usa la pila de Microsoft.
  • DataSet es una clase bastante ineficiente para enviar datos a través del cable - contiene también datos de seguimiento de cambios y metadatos.
  • Introduce un acoplamiento hermético: los cambios realizados en el lado del servicio que quizás ni siquiera necesiten los clientes deben reflejarse también en el lado del cliente.
+1

enlace ya no funciona – betitall

+2

en serio, un voto a favor porque un enlace a un sitio externo publicado hace 4 años dejó de funcionar? se reubicó el blog encontrado y se actualizó el enlace –

+1

Lo siento, no tenía claro el protocolo y el significado de la votación negativa. Solo quise indicar que el enlace estaba roto. Vázquez eliminado. – betitall

9

Puede enviar los datos como una cadena XML de un conjunto de datos por DataSet.GetXml()

Y que el usuario puede deserializar con DataSet.ReadXml()

y conseguir la tabla de datos del conjunto de datos por DataSet.Tables

Buena suerte

1

La forma más simple e interoperable es serializar el conjunto de datos a XML con el método GetXml(), luego pasar th th como una cadena del servicio web. El cliente puede entonces deserializarlo con el método ReadXml().

Hemos consumido un servicio que lo hizo de esta manera, y funcionó muy bien.

La alternativa es exponer la clase DataSet en el servicio y devolver el objeto del conjunto de datos. Pero esto complicará las cosas, especialmente si algún cliente no debe ser .NET.

2

DataTable son serializables pero existen algunos trucos para devolver un DataTable sin tipo a través de WebService.

Antes de que el método de servicio web devuelva la tabla de datos llena (en el lado del servicio) debe tener asignada la propiedad TableName.En caso de que dentro de OperationContract DataTable reciba la referencia de DataTable mecanografiada, la serialización fallará con messaga como "" El servidor no proporcionó una respuesta significativa; Esto puede deberse a una falta de coincidencia de contrato, un cierre prematuro de la sesión o un error interno del servidor. "

Significa que debe llenar el DataTable creado, por ejemplo, utilizando el método Merge (o manualmente). Aquí están ejemplos de implementación de DataContract ;

DataTable IHorizonCLService.RetrieveChangeLog(int iId) 
{ 
    DataTable dt = new DataTable(); //create new DataTable to be returned by this web method 
    dt.Merge(HorMan.RetrieveChangeLog(iId)); //get typed DataTable and fills the DataTable 
    dt.TableName = "SurChangeLogHor"; //assigns name 
    return dt; 
} 
1

Sólo una interesante observación de here

y, nunca, nunca, nunca enviar una instancia de System.Data.DataSet sobre el alambre nunca ha habido, no es ahora, y. nunca habrá ninguna razón para enviar alguna instancia de este tipo en cualquier lugar. Está más allá de lo masivo y hace que el objeto de transferencia de datos de 10,000 propiedades parezca liviano. El hecho de que algo sea serializable no significa que deba serlo.

Cuestiones relacionadas