Frage

Aktuelle Implementierung

SQL Server 2005-Datenbank mit einer Tabelle namens Nachrichten mit einer Spalte MessageXml vom Typ xml genannt.

C # Bibliothek Projekt mit einer LINQ to SQL-Klasse, die eine Klasse namens Nachricht mit einem Feld MessageXml vom Typ XElement.

genannt erzeugt

WCF Webservice, die eine MessagePayload-Klasse mit einer Eigenschaft namens MessageXml vom Typ XElement aussetzt.

Die Webservice meine Message-Klasse von LINQ to SQL erstellt dient nicht auf. Ich benutze ein geringes Gewicht Objekt als gehen zwischen.

Frage

Ist XElement wirklich der Typ ich in meinem WCF-Dienst zu verwenden will oder gibt es eine bessere Art. Die xml, die dazu bestimmt ist, in den Dienst übergeben werden soll ein vollständiger doc sein. Auch ich habe ein bisschen Probleme beim Laden von XML-Dokumenten als XElement. Ich denke, dass ich einen vollen XML-Dokumenttyp in der Lichtgewichtsklasse für den Dienst aussetzen soll, aber ich bin ein wenig verwirrt über die Unterschiede zwischen XDocument und XmlDocument.

Hinzu kommt, dass kann ich nicht die WCF Message-Klasse mit einer Eigenschaft von XDocument Art aussetzen, weil es eine Eigenschaft von XDeclaration Typ enthält, die nicht serialisiert werden können.

Wenn ich XmlDocument, als ich in meiner Übersetzung zwischen der Linq-Klasse dieser seltsame Umwandlung von XML-Typen zu tun habe, und die leichte Klasse.

 XmlDocument doc = new XmlDocument();
 doc.LoadXml(message.MessageXml.ToString());

 MessageEnvelope retVal = new MessageEnvelope()
 {
      MessageXml = doc,
 };

XmlDocument scheint, wie die richtige ist und ich weiß, ich werde einige Übersetzung zu tun haben, aber so nah wie möglich aneignen zu wollen.

War es hilfreich?

Lösung

Sie können entweder XElement oder XmlElement verwenden:

public XmlElement GetXmlElement()
{
    var doc = new XmlDocument();
    doc.Load(PREFIX + @"Enumerations.wsdl");

    return doc.DocumentElement;
}

public XElement GetXElement()
{
    var doc = XDocument.Load(PREFIX + @"Enumerations.wsdl");
    return doc.Root;
}

Sie wollen nicht entweder XDocument noch XmlDocument. Denken Sie daran, dass alles, was Sie zurück in der Mitte eines XML-Dokuments, den SOAP-Umschlag enthält. Sie können ein Dokument in einem Dokument haben, also was Sie wollen, ist ein Element.

Andere Tipps

John Saunders ist hier auf das Geld. Um etwas zu erarbeiten, wenn man sich die WSDL suchen, die erzeugt wird, wenn Sie entweder eine XmlElement oder eine XElement zurückkehren, werden Sie etwas sehen:

<xs:complexType>
  <xs:sequence>
    <xs:any minOccurs="0" processContents="lax"/>
  </xs:sequence>
</xs:complexType>

Das ist es. Es bedeutet im Grunde jede XML hier gehen kann. Es bedeutet auch, dass, im Gegensatz zu Chansik Vorschlag, es nicht den Rückgabetyp in eine .NET-spezifischen Art nicht bindet.

Also ja, brauchen Sie nicht eine Zeichenfolge zu verwenden.

Verwenden Sie unabhängig von der Art Sie die Klasse serialisiert werden müssen (String hat immer gut für mich gearbeitet hat) und dann Umwandlungen tun, wenn auf dem Server oder Client-Seite notwendig, um die Integrität des Dokuments zu erhalten. Sie können auch ein XDocument aus einem oder mehreren XElements bauen, so würde ich mit XElement gehen.

Im schlimmsten Fall können Sie auch die Serialisierung Verhalten Ihrer Klasse überschreiben (nicht zu schrecklich, wenn Sie mit Reflexion gut sind).

XmlDocument ist das alte, nicht Linq Dokument. Sie sind das gleiche Konzept in verschiedenen Klassen implementiert.

Generell XDocument und XElememnt vorzuziehen XmlDocument und XmlElement in Bezug auf Leistung.

Allerdings würde ich vorschlagen, string zu verwenden, um ein XML-Dokument über WCF-Dienst aus den folgenden Gründen an:

  1. Die Interoperabilität
    • Clients sind nicht auf bestimmte .NET Framework-Version gebunden (Client können wählen, XDocument oder XmlDocument verwenden. Auch Java-basierten Clients so lange unterstützt werden können als WCF-Dienste in einer solchen Art und Weise konfiguriert werden).
  2. Umgang mit XML-Deklaration richtig, wenn das ursprüngliche XML-Dokument enthält.

Hinweis: Bitte stellen Sie sicher, dass die Konfiguration anpassen entsprechend ein großes XML-Dokument zu unterstützen. Zum Beispiel ist standardmäßig max Nachrichtengröße der basicHttpBinding 64KB.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top