Utilizar XML como argumento o retorno en WCF


En ocasiones se requiere utilizar fragmentos de XML ya sea como argumento o bien como valor de retorno en operaciones con Servicios WCF (Windows Communication Foundation).

Basándome en el KB 330600: HOW TO: Use XmlDocument Elements When Passed to or Returned from WebMethods by Using Visual C# .NET para Servicios Web ASP.NET (aka ASMX), he modificado el código del ejemplo para utilizarlo con WCF.

En el ejemplo he empleando XmlElement como tipo de intercambio en lugar de XmlDocument, ya que si se intenta utilizar un XmlDocument en una operación de un servicio WCF se genera la siguiente excepción:

System.Runtime.Serialization.InvalidDataContractException: Type ‘System.Xml.XmlDocument’ cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute.

Mientras que con XmlElement es totalmente transparente, dado que es un tipo especial tratado como tipo primitivo por parte del DataContractSerializer.

Así pues, el servicio queda como sigue:

Listado XMLDocService.cs

using System;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.Xml;

[ServiceContract()]
public interface IXMLDocService
{
    [OperationContract]
    XmlElement GetXmlElement();

    [OperationContract]
    string GetFirstName(XmlElement XmlElementPassed);
}

public class XMLDocService : IXMLDocService
{

    public XmlElement GetXmlElement()
    {
        // Create an XmlDocument object.
        XmlDocument xmlDocumentObject = new XmlDocument();
        xmlDocumentObject.LoadXml(
        "<book genre=\"novel\" publicationdate=\"1997\" " +
        "      ISBN=\"1-861001-57-5\">" +
        "  <title>Pride And Prejudice</title>" +
        "  <author>" +
        "    <first-name>Jane</first-name>" +
        "    <last-name>Austen</last-name>" +
        "  </author>" +
        "  <price>24.95</price>" +
        "</book>");

        // Return the XmlElement object.
        XmlElement xmlDocumentElement = xmlDocumentObject.DocumentElement;
        return xmlDocumentElement;
    }

    public string GetFirstName(XmlElement XmlElementPassed)
    {
        // Create a new XmLDocument object.
        XmlDocument XmlDocumentObject = new XmlDocument();

        // Load the XML into the XmlDocument object.
        XmlDocumentObject.LoadXml(XmlElementPassed.OuterXml);

        // Find the first name of the author.
        XmlNodeList XmlNodeListObj = 
            XmlDocumentObject.GetElementsByTagName("first-name");

        // Return the first name.
        return XmlNodeListObj[0].ChildNodes[0].Value;
    }

}

Mientras que el cliente queda de la siguiente forma:

Listado Program.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace XMLDocClient
{
    class Program
    {
        static void Main(string[] args)
        {
            localhost.IXMLDocService myXMLDocService = new localhost.XMLDocServiceClient();
            System.Xml.XmlElement XmlElementObject = myXMLDocService.GetXmlElement();
            // Console.WriteLine(XmlElementObject.OuterXml);
            string strFirstName = myXMLDocService.GetFirstName(XmlElementObject);
            Console.WriteLine("The first name of the author is: " + strFirstName);
        }
    }
}

El resultado en la consola es:

The first name of the author is: Jane

 

Espero que sea de utilidad.

Nota: Además de XmlElement, también se puede utilizar una matriz de tipos XmlNode como una manera de representar XML directamente. De manera adicional, DataContractSerializer admite los tipos que implementan la interfaz IXmlSerializable, incluido el atributo relacionado XmlSchemaProviderAttribute y los tipos XDocument y XElement. Para más información, vea Clases de XML y ADO.NET en contratos de datos.

Acerca de Willy Mejia

Developer, Techie, Human... http://about.me/willyxoft
Esta entrada fue publicada en .NET, servicios web, WCF. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s