Domanda

Sto costruendo un servizio Web WCF che restituisce un oggetto composito che è simile al seguente:

    [DataContract]
    public class WebServiceReturn
    {
        ...

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

        ...
    }

Quando torno un oggetto WebServiceReturn con il seguente codice, tutto va bene:

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

Tuttavia, quando uso il codice qui sotto, che prende un XmlElement dai risultati di una chiamata di stored procedure che restituisce un XmlDataDocument, un CommunicationException viene gettato (che non ha eccezioni interne).

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

La parte confusa è se converto il XmlDataDocument.DocumentElement (che è un XmlElement) in un XElement e poi di nuovo in un XmlElement, non ci sono problemi (wow che era un boccone) - quindi il seguente codice restituisce senza alcun problema .

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

I dettagli CommunicationException sono:

[CommunicationException: Il server non ha fornito una risposta significativa; questo potrebbe essere causato da una mancata corrispondenza contratto, un arresto prematuro della sessione o un errore interno del server.]

Ho anche aggiornato il riferimento al servizio nella mia applicazione di test più volte, che non ha avuto alcun effetto.

E 'il problema con il mio codice di prova che chiama il servizio web? Perché sarebbe la conversione di un XmlElement in un XElement e poi di nuovo in un XmlElement risolvere il problema? Tutte le informazioni a tutti sarebbe molto apprezzato! :)

È stato utile?

Soluzione

Io non so nulla di strano in XmlDataDocument, ma non hanno necessariamente bisogno del XDocument - provare:

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

Ancora non non è l'ideale, ma sembra più pulito per me ...

Altri suggerimenti

Bene, al fine di ottenere ulteriori informazioni di errore, è necessario abilitare i dettagli di debug in colpa del server - il messaggio che stai ricevendo in questo momento è il generico, errore di rivelare nulla-to-possibili-attaccanti WCF messaggio, fondamentalmente dicendo:. qualcosa è andato storto

Per fare questo, è necessario per ottimizzare il vostro servizio di configurazione - aggiungere questa sezione (se non ne hai già uno):

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

e quindi fare riferimento quella sezione dal definizione di servizio:

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

Questo dovrebbe dare un errore più significativo, che si spera vi dà un'idea di ciò che va storto.

In caso contrario, sarà necessario eseguire il debug nel codice lato server e scoprire che cosa sta succedendo lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top