Question

Mise en œuvre actuelle

Base de données SQL Server 2005 avec une table appelée messages avec une colonne appelée MessageXml de type xml.

Projet de bibliothèque C # avec une classe Linq to Sql qui génère une classe appelée Message avec un champ appelé MessageXml de type XElement.

Webservice WCF qui expose une classe MessagePayload avec une propriété appelée MessageXml de type XElement.

Le service Web ne diffuse pas la classe Message créée par Linq à SQL. J'utilise un objet léger comme un intermédiaire.

Question

XElement est-il vraiment le type que je veux utiliser dans mon service WCF ou existe-t-il un meilleur type? Le fichier xml destiné à être transmis au service doit être un document complet. De plus, j'ai un peu de difficulté à charger des documents XML en tant que XElement. Je pense que je devrais exposer un type de document xml complet dans la classe lightweight du service, mais je suis un peu confus quant aux différences entre XDocument et XmlDocument.

De plus, je ne peux pas exposer la classe Message WCF avec une propriété de type XDocument car elle contient une propriété de type XDeclaration qui ne peut pas être sérialisée.

Si j'utilise XmlDocument, je dois effectuer cette conversion étrange des types xml dans ma traduction entre la classe Linq et la classe légère.

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

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

XmlDocument semble être le bon choix et je sais que je vais devoir faire une traduction, mais je veux me rapprocher le plus possible de ce qui est approprié.

Était-ce utile?

La solution

Vous pouvez utiliser XElement ou XmlElement:

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;
}

Vous ne voulez ni XDocument ni XmlDocument . N'oubliez pas que tout ce que vous retournez sera au milieu d'un document XML contenant l'enveloppe SOAP. Vous ne pouvez pas avoir de document dans un document, vous voulez donc un élément.

Autres conseils

John Saunders est sur l'argent ici. Pour élaborer légèrement, si vous regardez le WSDL généré lorsque vous renvoyez un XmlElement ou un XElement , vous verrez à peu près ceci:

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

C'est ça. Cela signifie fondamentalement que tout XML peut aller ici. Cela signifie également que, contrairement à la suggestion de Chansik, elle ne lie pas le type de retour à un type spécifique à .NET.

Alors oui, vous n'avez pas besoin d'utiliser une chaîne.

Utilisez le type dont vous avez besoin pour sérialiser la classe (String a toujours bien fonctionné pour moi), puis effectuez les conversions nécessaires, côté serveur ou côté client, afin de préserver l'intégrité du document. Vous pouvez également créer un XDocument à partir d'un ou de plusieurs XElements. J'utiliserais donc XElement.

Dans le pire des cas, vous pouvez même remplacer le comportement de sérialisation de votre classe (pas trop terrible si vous êtes doué pour la réflexion).

XmlDocument est l'ancien document, autre que Linq. Ils sont le même concept mis en œuvre dans différentes classes.

En général, XDocument et XElememnt sont préférables à XmlDocument et XmlElement en termes de performances.

Toutefois, je suggérerais d'utiliser chaîne pour envoyer un document XML via le service WCF pour les raisons suivantes:

  1. Interopérabilité
    • Les clients ne sont pas liés à une version spécifique du framework .NET (le client peut choisir d'utiliser XDocument ou XmlDocument . Même les clients basés sur Java peuvent être pris en charge aussi longtemps que les services WCF sont configurés de cette manière).
  2. Gestion correcte de la déclaration XML si le document XML d'origine la contient.

Remarque: veillez à régler correctement la configuration pour prendre en charge un document XML volumineux. Par exemple, la taille de message maximale par défaut de basicHttpBinding est de 64 Ko.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top