Domanda

Attuazione corrente

Database SQL Server 2005 con una tabella chiamata messaggi con una colonna chiamata MessageXml di tipo xml.

Progetto libreria C # con una classe Linq to Sql che genera una classe chiamata Message con un campo chiamato MessageXml di tipo XElement.

Servizio Web WCF che espone una classe MessagePayload con una proprietà chiamata MessageXml di tipo XElement.

Il servizio web non fornisce la mia classe Message creata da Linq a Sql. Uso un oggetto leggero come via di mezzo.

Domanda

XElement è davvero il tipo che voglio usare nel mio servizio WCF o esiste un tipo migliore? L'xml che deve essere passato al servizio dovrebbe essere un documento completo. Inoltre, ho un po 'di problemi a caricare documenti XML come XElement. Penso che dovrei esporre un tipo di documento XML completo nella classe leggera per il servizio, ma sono un po 'confuso sulle differenze tra XDocument e XmlDocument.

Inoltre, non posso esporre la classe Message WCF con una proprietà di tipo XDocument perché contiene una proprietà di tipo XDeclaration che non può essere serializzata.

Se uso XmlDocument di quanto devo fare questa strana conversione di tipi xml nella mia traduzione tra la classe Linq e la classe leggera.

 XmlDocument doc = new XmlDocument();
 doc.LoadXml(message.MessageXml.ToString());

 MessageEnvelope retVal = new MessageEnvelope()
 {
      MessageXml = doc,
 };

XmlDocument sembra quello giusto e so che dovrò fare una traduzione, ma voglio avvicinarmi il più possibile al più appropriato.

È stato utile?

Soluzione

Puoi usare XElement o 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;
}

Non vuoi XDocument XmlDocument . Ricorda che qualunque cosa tu restituisca sarà nel mezzo di un documento XML contenente la busta SOAP. Non puoi avere un documento all'interno di un documento, quindi quello che vuoi è un elemento.

Altri suggerimenti

John Saunders è qui con i soldi. Per elaborare un po ', se guardi il WSDL che viene generato quando restituisci un XmlElement o un XElement , vedrai qualcosa del genere:

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

Questo è tutto. Fondamentalmente significa che qualsiasi XML può andare qui. Significa anche che, contrariamente al suggerimento di Chansik, non associa il tipo restituito a un tipo specifico .NET.

Quindi sì, non è necessario usare una stringa.

Usa qualunque tipo di che sia necessario per serializzare la classe (String ha sempre funzionato bene per me) e quindi fai conversioni, se necessario, sul lato server o client per mantenere l'integrità del documento. Puoi creare un XDocument anche da uno o più XElement, quindi andrei con XElement.

Nel peggiore dei casi, puoi persino ignorare il comportamento di serializzazione della tua classe (non troppo terribile se sei bravo con la riflessione).

XmlDocument è il vecchio documento non Linq. Sono lo stesso concetto implementato in classi diverse.

In generale, XDocument e XElememnt sono preferibili a XmlDocument e XmlElement in termini di prestazioni.

Tuttavia, suggerirei di usare string per inviare un documento XML tramite il servizio WCF per i seguenti motivi:

  1. Interoperabilità
    • I client non sono collegati a una specifica versione di .NET framework (il client può scegliere di utilizzare XDocument o XmlDocument . Anche i client basati su Java possono essere supportati fintanto che i servizi WCF sono configurati in questo modo).
  2. Gestire correttamente la dichiarazione Xml se il documento XML originale la contiene.

Nota: assicurarsi di regolare la configurazione in modo appropriato per supportare un documento XML di grandi dimensioni. Ad esempio, la dimensione massima predefinita del messaggio di basicHttpBinding è 64 KB.

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