2009-12-16 6 views
1

Je construis un service Web WCF qui renvoie un objet composite qui ressemble à ce qui suit:WCF ne peuvent pas retourner XmlElement de XmlDataDocument.DocumentElement

[DataContract] 
    public class WebServiceReturn 
    { 
     ... 

     [DataMember] 
     public XmlElement Results { get; set; } 

     ... 
    } 

Quand je retourne un objet WebServiceReturn avec le code suivant , tout va bien:

XElement cities = new XElement("Cities", 
          from r in results 
          select new XElement("City", r));    

    using (XmlReader xmlReader = cities.CreateReader()) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(xmlReader); 
     WebServiceReturn response = new WebServiceReturn(); 
     response.Results = xmlDoc.DocumentElement; 
    } 

Cependant, lorsque j'utilise le code ci-dessous, qui prend une XmlElement à partir des résultats d'un appel de procédure stockée qui retourne un XmlDataDocument, une CommunicationException est levée (qui n'a pas d'exceptions internes).

XmlDataDocument xdd = DataAccess.ExecuteXML("MyStoredProc", parameter); 
response.Results = xdd.DocumentElement; 

La partie est source de confusion si je convertis le XmlDataDocument.DocumentElement (qui est un XmlElement) dans un XElement, puis de nouveau dans un XmlElement, il n'y a aucun problème (wow qui était une bouchée) - donc le code suivant retourne sans problème.

 XmlElement xe = DataAccess.ExecuteXML("MyStoredProc", parameter).DocumentElement; 
     XDocument xDoc = new XDocument(); 
     using (XmlWriter xmlWriter = xDoc.CreateWriter()){ 
      xe.WriteTo(xmlWriter); 
     } 

     using (XmlReader xmlReader = xDoc.Root.CreateReader()) 
     { 
      XmlDocument xmlDoc = new XmlDocument(); 
      xmlDoc.Load(xmlReader); 
      response.Results = xmlDoc.DocumentElement; 
     } 

Les détails de CommunicationException sont:

[CommunicationException: 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.]

J'ai également mis à jour la référence de service dans mon application de test plusieurs fois, ce qui n'a eu aucun effet.

Le problème avec mon code de test qui appelle le service Web est-il le problème? Pourquoi la conversion d'un XmlElement en un XElement et ensuite en XmlElement corrige le problème? Toute information serait très appréciée! :)

Répondre

2

Je ne sais pas quoi que ce soit d'étrange XmlDataDocument, mais vous ne pas nécessairement besoin du XDocument - essayer:

XmlDocument newDoc = new XmlDocument(); 
newDoc.Load(new XmlNodeReader(doc.DocumentElement)); 
return newDoc.DocumentElement; 

Pas encore idéal, mais il semble me plus propre ...

+0

Merci! Cela fonctionne également - serait toujours agréable de savoir quel est le problème exact de travailler avec l'élément document de XmlDataDocument et WCF est bien :) –

1

Eh bien, afin d'obtenir plus d'informations sur les erreurs, vous devrez activer les détails de débogage dans la faute de votre serveur - le message que vous obtenez en ce moment est le générique, révéler-rien-à-possible- message d'erreur WCF attaquants, en disant essentiellement: quelque chose s'est mal passé.

Pour ce faire, vous devez modifier votre configuration de service - ajouter cette section (si vous ne possédez pas déjà un):

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MEXandDebug"> 
     <serviceMetadata /> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

puis référence à cette section de votre définition de service:

<services> 
    <service behaviorConfiguration="MEXandDebug" name="WCFService.MyWCFService"> 

Cela devrait vous donner une erreur plus significative, qui, espérons-le, vous donne une idée de ce qui ne va pas.

Sinon, vous devrez déboguer votre code côté serveur et découvrir ce qui s'y passe.

+0

Cette est pratique à connaître, mais malheureusement, il ne fournit aucune information supplémentaire dans l'exception CommunicationException qui est levée. –