Serialização XML com XML Web Services
A serialização XML é o mecanismo de transporte subjacente usado na arquitetura XML Web Services, executada XmlSerializer pela classe. Para controlar o XML gerado por um XML Web Service, você pode aplicar os atributos listados em Atributos que controlam a serialização XML e Atributos que controlam a serialização SOAP codificada às classes, valores de retorno, parâmetros e campos de um arquivo usado para criar um XML Web Services (.asmx). Para obter mais informações sobre como criar um XML Web Services, consulte XML Web Services Using ASP.NET.
Estilos literais e codificados
O XML gerado por um XML Web Services pode ser formatado de duas maneiras, literal ou codificada, conforme explicado em Personalizando a formatação de mensagem SOAP. Portanto, há dois conjuntos de atributos que controlam a serialização XML. Os atributos listados em Atributos que controlam a serialização XML são projetados para controlar o estilo literal XML. Os atributos listados em Atributos que controlam a serialização SOAP codificada controlam o estilo codificado . Ao aplicar seletivamente esses atributos, você pode personalizar um aplicativo para retornar um ou ambos os estilos. Além disso, esses atributos podem ser aplicados (conforme apropriado) para retornar valores e parâmetros.
Exemplo de uso de ambos os estilos
Ao criar um XML Web Services, você pode usar ambos os conjuntos de atributos nos métodos. No exemplo de código a seguir, a classe nomeada MyService
contém dois métodos MyLiteralMethod
XML Web Service e MyEncodedMethod
. Ambos os métodos executam a mesma função: retornar uma instância da Order
classe. Order
Na classe, os atributos e são SoapTypeAttributeXmlTypeAttribute aplicados ao campo, e ambos os OrderID
atributos têm suas ElementName
propriedades definidas como valores diferentes.
Para executar o exemplo, cole o código em um arquivo com uma extensão .asmx e coloque o arquivo em um diretório virtual gerenciado pelo IIS (Serviços de Informações da Internet). Em um navegador da Web, digite o nome do computador, diretório virtual e arquivo.
<%@ 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;
}
}
O exemplo de código a seguir chama MyLiteralMethod
. O nome do elemento é alterado para "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>
O exemplo de código a seguir chama MyEncodedMethod
. O nome do elemento é "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>
Aplicando atributos a valores de retorno
Você também pode aplicar atributos para retornar valores para controlar o namespace, o nome do elemento e assim por diante. O exemplo de código a seguir aplica o XmlElementAttribute
atributo ao valor de retorno do MyLiteralMethod
método. Isso permite que você controle o namespace e o nome do 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;
}
Quando invocado, o código retorna XML semelhante ao seguinte.
<?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
Você também pode aplicar atributos a parâmetros para especificar namespace, nome do elemento e assim por diante. O exemplo de MyLiteralMethodResponse
código a seguir adiciona um parâmetro ao método e aplica o XmlAttributeAttribute
atributo ao parâmetro. O nome do elemento e o namespace são definidos para o 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;
}
A solicitação SOAP seria semelhante à seguinte.
<?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>
Aplicando atributos a classes
Se você precisar controlar o namespace de elementos que se correlacionam com classes, você pode aplicar XmlTypeAttribute
, XmlRootAttribute
e SoapTypeAttribute
, conforme apropriado. O exemplo de código a seguir aplica todos os três para a Order
classe.
<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;
}
Os resultados da aplicação do XmlTypeAttribute
e SoapTypeAttribute
podem ser vistos quando você examina a descrição do serviço, conforme mostrado no exemplo de código a seguir.
<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>
O efeito do XmlRootAttribute
também pode ser visto nos resultados HTTP GET e HTTP POST, da seguinte forma.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>