Serialización XML con servicios Web XML
La serialización XML es el mecanismo de transporte subyacente utilizado en la arquitectura de los servicios Web XML que lleva a cabo la clase XmlSerializer. Para controlar el XML generado por un servicio Web XML, puede aplicar los atributos enumerados en Atributos que controlan la serialización XML y Atributos que controlan la serialización SOAP codificada a las clases, valores devueltos, parámetros y campos de un archivo utilizado 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 que utilizan ASP.NET.
Estilos literales y codificados
El XML generado por un servicio Web XML puede tener el formato literal o el formato codificado, como se explica en Personalizar el formato de los mensajes SOAP. Por lo tanto, hay dos conjuntos de atributos que controlan la serialización XML. Los atributos que aparecen en Atributos que controlan la serialización XML están pensados para controlar el estilo literal XML. Los atributos enumerados en Atributos que controlan la serialización SOAP codificada controlan el estilo codificado. Al aplicar selectivamente estos atributos, puede personalizar una aplicación para que devuelva uno o ambos estilos. Además, estos atributos pueden aplicarse, según corresponda, a parámetros y valores devueltos.
Ejemplo de utilización de ambos estilos
Al crear un servicio Web XML, se pueden utilizar los dos 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, MyLiteralMethod
y MyEncodedMethod
. Ambos métodos realizan la misma función: devolver una instancia de la clase Order
. En la clase Order
, los atributos XmlTypeAttribute y SoapTypeAttribute se aplican al campo OrderID
y los dos atributos tienen valores diferentes en su propiedad ElementName
.
Para ejecutar el ejemplo, pegue el código en un archivo con la extensión .asmx y colóquelo en un directorio virtual que administren los Servicios de Internet Information Server (IIS). En un explorador HTML, como Internet Explorer, 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 de elemento se cambia por "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="https://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 de 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="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="https://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>
Aplicar atributos a valores devueltos
También puede aplicar atributos a valores devueltos para controlar el espacio de nombres, nombre de elemento, etcétera. En el ejemplo siguiente se aplica el atributo XmlElementAttribute
al valor devuelto del método MyLiteralMethod
. Esto permite controlar el nombre del elemento y el espacio de nombres.
<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 con la apariencia 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="https://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, nombre de elemento, etcétera. En el ejemplo siguiente se agrega un parámetro al método MyLiteralMethodResponse
y se aplica el atributo XmlAttributeAttribute
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:="https://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="https://www.microsoft.com")] string ID){
Order myOrder = new Order();
myOrder.OrderID = ID;
return myOrder;
}
La solicitud SOAP tendría la apariencia 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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethod xmlns="http://tempuri.org/">
<MyOrderID xmlns="https://www.microsoft.com">string</MyOrderID>
</MyLiteralMethod>
</soap:Body>
</soap:Envelope>
Aplicar atributos a clases
Si debe controlar el espacio de nombres de elementos que se correlacionan con clases, puede aplicar los atributos XmlTypeAttribute
, XmlRootAttribute
y SoapTypeAttribute
, según corresponda. En el ejemplo de código siguiente se aplican los tres atributos a la clase Order
.
<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 atributos 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>
El efecto de XmlRootAttribute
también puede verse en los resultados para HTTP GET y HTTP POST del siguiente modo.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
Vea también
Tareas
Cómo serializar un objeto como secuencia XML con codificación SOAP
Cómo reemplazar la serialización XML con codificación SOAP
Cómo serializar un objeto
Cómo deserializar un objeto
Conceptos
Atributos que controlan la serialización SOAP codificada
Presentación de la serialización XML