Compartir a través de


Serialización XML con servicios web XML

La serialización XML es el mecanismo de transporte subyacente que se usa en la arquitectura de servicios web XML, que realiza la XmlSerializer clase . Para controlar el XML generado por un servicio web XML, puede aplicar los atributos enumerados en atributos que controlan la serialización XML y los atributos que controlan la serialización SOAP codificada a las clases, los valores devueltos, los parámetros y los campos de un archivo que se usan para crear un servicio web XML (.asmx). Para obtener más información sobre cómo crear un servicio web XML, vea Servicios web XML mediante ASP.NET.

Estilos literales y codificados

El XML generado por un servicio web XML se puede formatear de una de estas dos maneras, ya sea literal o codificada, como se explica en Personalización del formato de mensaje SOAP. Por lo tanto, hay dos conjuntos de atributos que controlan la serialización XML. Los atributos enumerados en Atributos que controlan la serialización XML están diseñados para controlar el estilo literal XML. Los atributos enumerados en Atributos que controlan la serialización SOAP codificada controlan el estilo codificado. Al aplicar estos atributos de forma selectiva, puede adaptar una aplicación para devolver uno o ambos estilos. Además, estos atributos se pueden aplicar (según corresponda) para devolver valores y parámetros.

Ejemplo de uso de ambos estilos

Al crear un servicio web XML, puede usar ambos conjuntos de atributos en los métodos . En el ejemplo de código siguiente, la clase denominada MyService contiene dos métodos de servicio web XML y MyLiteralMethodMyEncodedMethod. Ambos métodos realizan la misma función: devolver una instancia de la Order clase . En la Order clase, los atributos XmlTypeAttribute y SoapTypeAttribute se aplican al campo OrderID, y ambos atributos tienen su propiedad ElementName establecida en diferentes valores.

Para ejecutar el ejemplo, pegue el código en un archivo con una extensión .asmx y coloque el archivo en un directorio virtual administrado por Internet Information Services (IIS). En un explorador web, escriba el nombre del equipo, el directorio virtual y el archivo.

<%@ WebService Language="VB" Class="MyService" %>  
Imports System  
Imports System.Web.Services  
Imports System.Web.Services.Protocols  
Imports System.Xml.Serialization  
Public Class Order  
    ' Both types of attributes can be applied. Depending on which type  
    ' the method used, either one will affect the call.  
    <SoapElement(ElementName:= "EncodedOrderID"), _  
    XmlElement(ElementName:= "LiteralOrderID")> _  
    public OrderID As String  
End Class  
  
Public Class MyService  
    <WebMethod, SoapDocumentMethod> _  
    public Function MyLiteralMethod() As Order
        Dim myOrder As Order = New Order()  
        return myOrder  
    End Function  
    <WebMethod, SoapRpcMethod> _  
    public Function MyEncodedMethod() As Order
        Dim myOrder As Order = New Order()  
        return myOrder  
    End Function  
End Class  
<%@ WebService Language="C#" Class="MyService" %>  
using System;  
using System.Web.Services;  
using System.Web.Services.Protocols;  
using System.Xml.Serialization;  
public class Order {  
    // Both types of attributes can be applied. Depending on which type  
    // the method used, either one will affect the call.  
    [SoapElement(ElementName = "EncodedOrderID")]  
    [XmlElement(ElementName = "LiteralOrderID")]  
    public String OrderID;  
}  
public class MyService {  
    [WebMethod][SoapDocumentMethod]  
    public Order MyLiteralMethod(){  
        Order myOrder = new Order();  
        return myOrder;  
    }  
    [WebMethod][SoapRpcMethod]  
    public Order MyEncodedMethod(){  
        Order myOrder = new Order();  
        return myOrder;  
    }  
}  

En el ejemplo de código siguiente se llama a MyLiteralMethod. El nombre del elemento se cambia a "LiteralOrderID".

<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethodResponse xmlns="http://tempuri.org/">  
            <MyLiteralMethodResult>  
                <LiteralOrderID>string</LiteralOrderID>  
            </MyLiteralMethodResult>  
        </MyLiteralMethodResponse>  
    </soap:Body>  
</soap:Envelope>  

En el ejemplo de código siguiente se llama a MyEncodedMethod. El nombre del elemento es "EncodedOrderID".

<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">  
        <tns:MyEncodedMethodResponse>  
            <MyEncodedMethodResult href="#id1" />  
        </tns:MyEncodedMethodResponse>  
        <types:Order id="id1" xsi:type="types:Order">  
            <EncodedOrderID xsi:type="xsd:string">string</EncodedOrderID>  
        </types:Order>  
    </soap:Body>  
</soap:Envelope>  

Aplicación de atributos a valores devueltos

También puede aplicar atributos para devolver valores para controlar el espacio de nombres, el nombre del elemento, etc. En el ejemplo de código siguiente se aplica el XmlElementAttribute atributo al valor devuelto del MyLiteralMethod método . Si lo hace, puede controlar el espacio de nombres y el nombre del elemento.

<WebMethod, SoapDocumentMethod> _  
public Function MyLiteralMethod() As _  
<XmlElement(Namespace:="http://www.cohowinery.com", _  
ElementName:= "BookOrder")> _  
Order
    Dim myOrder As Order = New Order()  
    return myOrder  
End Function  
[return: XmlElement(Namespace = "http://www.cohowinery.com",  
ElementName = "BookOrder")]  
[WebMethod][SoapDocumentMethod]  
public Order MyLiteralMethod(){  
    Order myOrder = new Order();  
    return myOrder;  
}  

Cuando se invoca, el código devuelve XML similar al siguiente.

<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethodResponse xmlns="http://tempuri.org/">  
            <BookOrder xmlns="http://www.cohowinery.com">  
                <LiteralOrderID>string</LiteralOrderID>  
            </BookOrder>  
        </MyLiteralMethodResponse>  
    </soap:Body>  
</soap:Envelope>  

Atributos aplicados a parámetros

También puede aplicar atributos a parámetros para especificar el espacio de nombres, el nombre del elemento, etc. En el ejemplo de código siguiente se agrega un parámetro al MyLiteralMethodResponse método y se aplica el XmlAttributeAttribute atributo al parámetro . El nombre del elemento y el espacio de nombres se establecen para el parámetro .

<WebMethod, SoapDocumentMethod> _  
public Function MyLiteralMethod(<XmlElement _  
("MyOrderID", Namespace:="http://www.microsoft.com")>ID As String) As _  
<XmlElement(Namespace:="http://www.cohowinery.com", _  
ElementName:= "BookOrder")> _  
Order
    Dim myOrder As Order = New Order()  
    myOrder.OrderID = ID  
    return myOrder  
End Function  
[return: XmlElement(Namespace = "http://www.cohowinery.com",  
ElementName = "BookOrder")]  
[WebMethod][SoapDocumentMethod]  
public Order MyLiteralMethod([XmlElement("MyOrderID",
Namespace="http://www.microsoft.com")] string ID){  
    Order myOrder = new Order();  
    myOrder.OrderID = ID;  
    return myOrder;  
}

La solicitud SOAP sería similar a la siguiente.

<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
    <soap:Body>  
        <MyLiteralMethod xmlns="http://tempuri.org/">  
            <MyOrderID xmlns="http://www.microsoft.com">string</MyOrderID>  
        </MyLiteralMethod>  
    </soap:Body>  
</soap:Envelope>  

Aplicación de atributos a clases

Si necesita controlar el espacio de nombres de los elementos que se correlacionan con las clases, puede aplicar XmlTypeAttribute, XmlRootAttributey SoapTypeAttribute, según corresponda. En el ejemplo de código siguiente se aplican las tres a la Order clase .

<XmlType("BigBookService"), _  
SoapType("SoapBookService"), _  
XmlRoot("BookOrderForm")> _  
Public Class Order  
    ' Both types of attributes can be applied. Depending on which  
    ' the method used, either one will affect the call.  
    <SoapElement(ElementName:= "EncodedOrderID"), _  
    XmlElement(ElementName:= "LiteralOrderID")> _  
    public OrderID As String  
End Class  
[XmlType("BigBooksService", Namespace = "http://www.cpandl.com")]  
[SoapType("SoapBookService")]  
[XmlRoot("BookOrderForm")]  
public class Order {  
    // Both types of attributes can be applied. Depending on which  
    // the method used, either one will affect the call.  
    [SoapElement(ElementName = "EncodedOrderID")]  
    [XmlElement(ElementName = "LiteralOrderID")]  
    public String OrderID;  
}  

Los resultados de aplicar los XmlTypeAttribute y SoapTypeAttribute pueden verse al examinar la descripción del servicio, como se muestra en el ejemplo de código siguiente.

<s:element name="BookOrderForm" type="s0:BigBookService" />
<s:complexType name="BigBookService">
  <s:sequence>
    <s:element minOccurs="0" maxOccurs="1" name="LiteralOrderID" type="s:string" />
  </s:sequence>

  <s:schema targetNamespace="http://tempuri.org/encodedTypes">
    <s:complexType name="SoapBookService">
      <s:sequence>
        <s:element minOccurs="1" maxOccurs="1" name="EncodedOrderID" type="s:string" />
      </s:sequence>
    </s:complexType>
  </s:schema>
</s:complexType>

El efecto de XmlRootAttribute también se puede ver en los resultados HTTP GET y HTTP POST, como se indica a continuación.

<?xml version="1.0" encoding="utf-8"?>  
<BookOrderForm xmlns="http://tempuri.org/">  
    <LiteralOrderID>string</LiteralOrderID>  
</BookOrderForm>  

Consulte también