Frage

Ich baue einen WCF-Webdienst, der ein zusammengesetztes Objekt zurück, das ähnlich aussieht wie folgt zusammen:

    [DataContract]
    public class WebServiceReturn
    {
        ...

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

        ...
    }

Wenn ich ein WebServiceReturn Objekt mit dem folgenden Code zurückgeben, ist alles in Ordnung:

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

Doch wenn ich den Code unten, die eine XmlElement aus den Ergebnissen des Aufrufs eines gespeicherten Prozedur dauert, dass die Renditen ein XmlDataDocument, ein Communication geworfen wird (die keine inneren Ausnahmen hat).

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

Das verwirrende Teil ist, wenn ich die XmlDataDocument.DocumentElement konvertieren (das ein XmlElement) in ein XElement und dann zurück in ein XmlElement, gibt es keine Probleme (wow, das war ein Schluck) - so der folgende Code ohne Probleme .

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

Die Communication Details sind:

[Communication: Der Server hat keine aussagekräftigen Antworten; dies könnte durch einen Vertrag Mismatch, eine vorzeitige Sitzung Herunterfahren oder einen internen Server-Fehler verursacht werden.]

Ich habe auch den Dienstverweis in meiner Testanwendung mehrmals aktualisiert, die keinen Einfluss gehabt hat.

Ist das Problem mit meinem Test-Code, der den Web-Dienst ruft an? Warum sollte ein XmlElement in eine XElement Umwandlung und dann zurück in eine XmlElement Fix wird das Problem? Alle Informationen überhaupt würde sehr geschätzt werden! :)

War es hilfreich?

Lösung

Ich weiß nicht, etwas merkwürdig XmlDataDocument, aber Sie müssen nicht unbedingt die XDocument - Versuch:

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

Immer noch nicht ideal, aber es scheint mir, saubere ...

Andere Tipps

Nun, um mehr Fehlerinformationen zu erhalten, müssen Sie die Debug-Informationen in Ihrem Server-Fehlern ermöglichen - die Nachricht, die Sie gerade jetzt immer ist die allgemeine, offenbaren-nichts-zu-möglich-Angreifer WCF-Fehler Nachricht, im Grunde sagen:. etwas schief gegangen ist

Um das zu tun, müssen Sie Ihre Dienstkonfiguration optimieren - diesen Abschnitt aus (wenn Sie nicht bereits eine haben):

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

und dann diesen Abschnitt von Ihrer Service-Definition verweisen:

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

Das sollten Sie einen sinnvollen Fehler, die hoffentlich gibt Ihnen eine Vorstellung davon, was schief geht.

Sonst werden Sie debuggen müssen in Ihren serverseitigen Code und herauszufinden, was dort passiert.

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