2009-06-18 7 views
2

La mise en œuvre actuelleQu'est-ce qu'un type XML approprié pour le service Web?

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

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

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

Le service Web ne sert pas ma classe Message créée par Linq à Sql. J'utilise un objet léger entre les deux.

Question

Est-XElement vraiment le type que je veux être en utilisant dans mon service WCF ou est-il un meilleur type. Le fichier XML qui doit être transmis au service doit être un document complet. En outre, j'ai un peu de mal à charger des documents XML en tant que XElement. Je pense que je devrais exposer un type de document xml complet dans la classe de poids léger pour le service, mais je suis un peu confus sur les différences entre XDocument et XmlDocument. De plus, je ne peux pas exposer la classe WCF Message 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 que je dois faire cette étrange conversion de 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 la bonne et je sais que je vais devoir faire une traduction, mais veulent se rapprocher de s'approprier que possible.

Répondre

3

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 pas non plus XDocument ni XmlDocument. Rappelez-vous que tout ce que vous retournerez sera au milieu d'un document XML contenant l'enveloppe SOAP. Vous ne pouvez pas avoir de document dans un document, ce que vous voulez, c'est un élément.

-1

Utilisez le type dont vous avez besoin pour sérialiser la classe (la chaîne a toujours bien fonctionné pour moi), puis effectuez des conversions si nécessaire côté serveur ou côté client pour préserver l'intégrité du document. Vous pouvez également créer un XDocument avec un ou plusieurs XElements, donc j'irais avec 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 bon avec la réflexion).

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

+1

-1: XML n'est pas la même chose qu'une chaîne. Ne l'utilisez pas pour représenter XML. –

+0

Je suis conscient, c'est pourquoi vous devez le valider avant et après la conversion pour la sérialisation ... – marr75

-2

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

Cependant, je suggère d'utiliser string pour envoyer un document XML via le service WCF pour les raisons suivantes:

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

Remarque: Veuillez vous assurer d'ajuster la configuration de manière appropriée pour prendre en charge un document XML de grande taille. Par exemple, la taille de message maximale par défaut de basicHttpBinding est de 64 Ko.

+1

-1: Total non-sens. Envoyez juste un XmlElement. Qu'est-ce qui ne va pas avec ça? Il envoie juste le XML. –

3

John Saunders est sur l'argent ici. Pour élaborer un peu, si vous regardez le WSDL qui est généré lorsque vous revenez soit un XmlElement ou un XElement, vous verrez quelque chose comme ceci:

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

Voilà. Cela signifie essentiellement que tout XML peut aller ici. Cela signifie également que, contrairement à la suggestion de Chansik, il ne lie pas le type de retour à un type spécifique à .NET.

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

Questions connexes