Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A serialização XML é o mecanismo de transporte subjacente usado na arquitetura de serviços Web XML, executado pela XmlSerializer classe. Para controlar o XML gerado por um serviço Web XML, você pode aplicar os atributos listados em ambos os atributos que controlam a serialização XML e atributos que controlam a serialização SOAP codificada às classes, retornar valores, parâmetros e campos de um arquivo usados para criar um serviço Web XML (.asmx). Para obter mais informações sobre como criar um serviço Web XML, consulte Serviços Web XML usando ASP.NET.
Estilos literais e codificados
O XML gerado por um serviço Web XML pode ser formatado de uma das duas maneiras, literal ou codificada, conforme explicado na Personalização da Formatação de Mensagens 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. Aplicando seletivamente esses atributos, você pode adaptar um aplicativo para retornar ou ambos os estilos. Além disso, esses atributos podem ser aplicados (conforme apropriado) para retornar valores e parâmetros.
Exemplo de como usar ambos os estilos
Ao criar um serviço Web XML, 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 de serviço Web XML e MyEncodedMethod. Ambos os métodos executam a mesma função: retornando uma instância da Order classe. Na classe Order, os atributos XmlTypeAttribute e SoapTypeAttribute são aplicados ao campo OrderID, e ambos os atributos têm sua propriedade ElementName definida para 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 pelos Serviços de Informações da Internet (IIS). 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 retornados
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 retornado do MyLiteralMethod método. Isso permite controlar 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 código a seguir adiciona um parâmetro ao MyLiteralMethodResponse 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 se assemelharia 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>
<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 às classes, poderá aplicar XmlTypeAttribute, XmlRootAttributee SoapTypeAttribute, conforme apropriado. O exemplo de código a seguir aplica os três à 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 de 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 maneira.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>