2009-02-18 6 views

Répondre

1

Vous pouvez transférer DataTable via un service Web. C'est probablement votre meilleure option, car c'est ce que le client a demandé.

5

Bien sûr. DataTable et DataSet sont tous deux sérialisables, et ils ont également des fonctions ReadXml() et WriteXml() que vous pouvez utiliser.

7

Si vous l'exposez comme DataSet/DataTable, il fera quand même sa propre sérialisation (via IXmlSerializable, IIRC). Notez que DataSet/DataTable ne permettent pas d'obtenir de bons types de données sur les services Web si vous souhaitez que le service soit portable vers d'autres formes (par exemple, un client Java, etc.). Mais vous pouvez simplement l'exposer comme tel si vous voulez ...; .NET s'occupera de la traduction.

+5

Assurez-vous de définir le nom de la table ou l'erreur lors de la sérialisation. – tsilb

7

Voir this post par Richard Blewett pour des raisons pour lesquelles vous ne voudriez probablement pas faire cela.

EDIT: Pour résumer ce qui précède:

  • L'utilisation DataSet n'est pas interopérable. Il utilise des annotations qui n'ont de sens que lorsque chaque extrémité du lien utilise la pile Microsoft.
  • DataSet est une classe assez inefficace pour l'envoi de données sur le réseau - elle contient également des données de suivi des modifications et des métadonnées.
  • Il introduit un couplage étroit - les modifications apportées au niveau du service, qui peuvent même ne pas être nécessaires pour le client, doivent également être prises en compte par le client.
+1

lien ne fonctionne plus – betitall

+2

sérieusement, un downvote parce qu'un lien vers un site externe posté il y a 4 ans a cessé de fonctionner? blog déplacé trouvé et lien mis à jour –

+1

Désolé, je n'étais pas clair sur le protocole et la signification de downvoting. Je voulais seulement indiquer que le lien était brisé. Downvote supprimé. – betitall

9

Vous pouvez envoyer les données sous forme de chaîne XML à partir d'un ensemble de données par DataSet.GetXml()

Et que l'utilisateur peut désérialiser avec DataSet.ReadXml()

Et obtenir le datatable de l'ensemble de données par DataSet.Tables

Bonne chance

1

Le moyen le plus simple et le plus interopérable est de sérialiser le jeu de données en XML avec la méthode GetXml(), puis de passer comme une chaîne du service Web. Le client peut ensuite le désérialiser avec la méthode ReadXml().

Nous avons consommé un service qui l'a fait de cette façon, et cela a bien fonctionné.

L'alternative consiste à exposer la classe DataSet dans le service et à renvoyer l'objet de jeu de données. Mais cela va compliquer les choses, surtout si n'importe quel client devrait être non.NET.

2

DataTable sont sérialisables, mais certaines astuces existent pour renvoyer un DataTable non typé via WebService. Avant que la méthode de service Web ne renvoie le DataTable rempli (côté service), elle doit avoir une propriété TableName affectée à la propriété

Dans le cas où à l'intérieur de l'OperationContract DataTable reçoit la référence de DataTable typé la sérialisation échouera avec messaga comme "" Le serveur n'a pas fourni une réponse significative; Cela peut être dû à une incompatibilité de contrat, à une fermeture de session prématurée ou à une erreur interne du serveur. »

Cela signifie que vous devez remplir le DataTable créé, par exemple en utilisant la méthode Fusionner (ou manuellement). ;

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

Juste une remarque intéressante de here

et, jamais, jamais, jamais envoyé une instance de System.Data.DataSet sur le fil n'a jamais été, est pas maintenant, et. ne sera jamais aucune raison d'envoyer jamais une instance de ce type partout. Il est au-delà de la masse et rend l'objet de transfert de données de 10 000 propriétés plus léger. Le fait que quelque chose soit sérialisable ne signifie pas qu'il devrait l'être.

Questions connexes