Ich verwende einen Webdienst, um Daten aus einer Tabelle abzufragen. Dann muss ich es an einen Benutzer senden, der es als DataTable will. Kann ich die Daten serialisieren? Oder sollte ich es als ein DataSet senden. Ich bin neu in Web Services, daher bin ich mir nicht sicher, wie es am besten geht.Kann ich eine Datentabelle oder einen Datensatz zur Übertragung über einen Web-Service in C# serialisieren?
Antwort
Sie können DataTables über einen Web-Service übertragen. Das ist wahrscheinlich die beste Option, weil der Kunde danach gefragt hat.
Sicher. Sowohl DataTable als auch DataSet sind serialisierbar und sie haben auch die Funktionen ReadXml() und WriteXml(), die Sie ebenfalls verwenden können.
Wenn Sie es als DataSet
/DataTable
aussetzen, wird es sowieso seine eigene Serialisierung (über IXmlSerializable
, IIRC) tun. Beachten Sie, dass DataSet
/DataTable
nicht für gute Datentypen in Webdiensten sorgen, wenn der Dienst für andere patforms (d. H. Einen Java-Client usw.) portierbar sein soll. Aber Sie können einfach als solche aussetzen, wenn Sie wollen ...; .NET wird sich mit der Übersetzung befassen.
Siehe this post von Richard Blewett aus Gründen, warum Sie wahrscheinlich dies nicht tun möchten.
EDIT: Um die oben zusammenfassen:
DataSet
Verwendung ist nicht kompatibel. Es verwendet Annotationen, die nur Sinn ergeben, wenn jedes Ende des Links den Microsoft-Stack verwendet.DataSet
ist eine ziemlich ineffiziente Klasse für das Senden von Daten über die Leitung - es enthält auch Change-Tracking-Daten und Metadaten.- Es führt eine enge Kopplung ein - Änderungen auf der Serviceseite, die vom Client nicht einmal benötigt werden, müssen sich auch auf der Clientseite widerspiegeln.
Link funktioniert nicht mehr – betitall
ernsthaft, ein Downvote, weil ein Link zu einer externen Website vor 4 Jahren funktioniert nicht mehr funktioniert? relocated blog found und link aktualisiert –
Sorry, ich war nicht klar über das Protokoll und die Bedeutung des Downvotings. Ich wollte nur anzeigen, dass die Verbindung unterbrochen wurde. Downvote entfernt – betitall
Sie können die Daten als XML-Zeichenfolge aus einem Datensatz von DataSet.GetXml()
Und als der Benutzer kann es senden deserialisieren mit DataSet.ReadXml()
und nutzen Sie die Datentabelle aus dem Datensatz von DataSet.Tables
Viel Glück
Die einfachste und interoperabelste Möglichkeit besteht darin, das Dataset mit der GetXml() -Methode in XML zu serialisieren und dann th zu übergeben als eine Zeichenfolge aus dem Webdienst. Der Client kann es dann mit der ReadXml() -Methode deserialisieren.
Wir haben einen Service konsumiert, der es so gemacht hat, und es hat super funktioniert.
Die Alternative besteht darin, die DataSet-Klasse im Service verfügbar zu machen und das Dataset-Objekt zurückzugeben. Aber dies wird die Dinge komplizieren, vor allem, wenn jeder Client nicht-NET sein sollte.
DataTable ist serialisierbar, aber es gibt einige Tricks, um ein nicht typisiertes DataTable über WebService zurückzugeben.
Bevor die Webdienstmethode die gefüllte DataTable (auf der Serviceseite) zurückgibt, muss die Eigenschaft TableName zugewiesen sein.Wenn innerhalb der OperationContract DataTable die Referenz der getippten DataTable empfangen wird, wird die Serialisierung mit messaga fehlschlagen wie "" Der Server lieferte keine aussagekräftige Antwort; Dies kann durch eine Vertragsinkongruenz, eine vorzeitige Sitzungsabschaltung oder einen internen Serverfehler verursacht werden. "
Es bedeutet, dass Sie die erstellte DataTable füllen sollten, zum Beispiel mit Merge (oder manuell). Hier sind solche DataContract-Implementierung Beispiel ;
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;
}
Nur eine interessante Bemerkung von here
und nie, nie, nie eine Instanz System.Data.DataSet über den Draht senden Es war noch nie, ist nicht jetzt, und. Es wird nie einen Grund geben, jemals eine Instanz von dieser Typ irgendwo. Es ist jenseits von massiv und macht das 10.000 Eigenschaft Datenübertragungsobjekt scheinen leicht. Die Tatsache, dass etwas serialisierbar ist, bedeutet nicht, dass es so sein sollte.
Stellen Sie sicher, dass Sie den Tabellenname festgelegt haben, sonst tritt beim Serialisieren ein Fehler auf. – tsilb