Question

Je construis un service Web WCF qui renvoie un objet composite qui ressemble à ce qui suit:

    [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, un CommunicationException est lancé (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 pourrait être causé par une incompatibilité de contrat, un arrêt de la session prématurée ou une erreur de serveur interne.]

Je l'ai également mis à jour la référence de service dans mon application de test à plusieurs reprises qui n'a eu aucun effet.

est le problème avec mon code de test qui appelle le service Web? Pourquoi serait la conversion d'un XmlElement en un XElement, puis de nouveau dans un XmlElement résoudre le problème? Toute information serait tout très apprécié! :)

Était-ce utile?

La solution

Je ne sais pas quoi que ce soit d'étrange XmlDataDocument, mais vous n'avez pas nécessairement le XDocument - essayez:

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

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

Autres conseils

Eh bien, afin d'obtenir plus d'informations d'erreur, vous devez activer les détails de débogage dans votre faute du serveur - le message que vous obtenez le droit est maintenant le générique, révèle rien à d'éventuelles-attaquants erreur de WCF message, essentiellement en disant:. quelque chose a mal tourné

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 faire 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, ce qui vous donne une idée, espérons-ce qui va mal.

Sinon, vous aurez besoin de débogage dans votre code côté serveur et découvrez ce qui se passe là-bas.

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