Serializzazione XML mediante servizi Web XML
La serializzazione XML rappresenta il meccanismo di trasporto sottostante utilizzato nell'architettura dei servizi Web XML ed eseguito dalla classe XmlSerializer. Per controllare il linguaggio XML generato da un servizio Web XML, è possibile applicare gli attributi elencati in Attributi che controllano la serializzazione XML e Attributi che controllano la serializzazione con codifica SOAP alle classi, valori restituiti, parametri e campi di un file con estensione asmx utilizzato per creare un servizio Web XML. Per ulteriori informazioni sulla creazione di un servizio Web XML, vedere Generazione di servizi Web XML mediante ASP.NET.
Stili Literal ed Encoded
Il linguaggio XML generato da un servizio Web XML può essere formattato così com'è o in forma codificata, come spiegato in Personalizzazione della formattazione di messaggi SOAP. Esistono pertanto due gruppi di attributi che controllano la serializzazione XML. Gli attributi elencati in Attributi che controllano la serializzazione XML sono progettati per il controllo dello stile Literal del linguaggio XML. Gli attributi elencati in Attributi che controllano la serializzazione con codifica SOAP controllano lo stile Encoded. Se si applicano questi attributi in modo selettivo, è possibile personalizzare un'applicazione in modo che restituisca l'uno o l'altro o entrambi gli stili. Questi attributi possono inoltre essere applicati a valori restituiti e parametri in base alle esigenze.
Esempio di utilizzo di entrambi gli stili
Quando si crea un servizio Web XML, è possibile utilizzare entrambi i gruppi di attributi nei metodi. Nell'esempio di codice seguente, la classe denominata MyService
contiene due metodi di servizio Web XML, MyLiteralMethod
e MyEncodedMethod
. Entrambi i metodi eseguono la stessa funzione, ovvero restituiscono un'istanza della classe Order
. Nella classe Order
gli attributi XmlTypeAttribute e SoapTypeAttribute sono entrambi applicati al campo OrderID
ed entrambi hanno la proprietà ElementName
impostata su valori diversi.
Per eseguire l'esempio, incollare il codice in un file con estensione asmx e inserire il file in una directory virtuale gestita da Internet Information Services (IIS). Da un browser HTML, ad esempio Internet Explorer, digitare il nome del computer, la directory virtuale e il file.
<%@ 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;
}
}
Nell'esempio di codice seguente viene chiamato MyLiteralMethod
. Il nome di elemento viene modificato in "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>
Nell'esempio di codice seguente viene chiamato MyEncodedMethod
. Il nome di 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="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>
Applicazione di attributi a valori restituiti
È inoltre possibile applicare attributi a valori restituiti per controllare lo spazio dei nomi, il nome di elemento e così via. Nell'esempio di codice seguente l'attributo XmlElementAttribute
viene applicato al valore restituito del metodo MyLiteralMethod
. In questo modo è possibile controllare lo spazio dei nomi e il nome di 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 viene richiamato, il codice restituisce XML simile a quello seguente.
<?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>
Attributi applicati a parametri
È inoltre possibile applicare attributi a parametri per specificare lo spazio dei nomi, il nome di elemento e così via. Nell'esempio di codice seguente viene aggiunto un parametro al metodo MyLiteralMethodResponse
e l'attributo XmlAttributeAttribute
viene applicato al parametro. Il nome di elemento e lo spazio dei nomi sono entrambi impostati per il parametro.
<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 richiesta SOAP potrebbe essere simile a quanto segue.
<?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>
Applicazione di attributi a classi
Se è necessario controllare lo spazio dei nomi di elementi correlati a classi, è possibile applicare gli attributi XmlTypeAttribute
, XmlRootAttribute
e SoapTypeAttribute
in base alle esigenze. Nell'esempio di codice seguente tutti gli attributi vengono applicati alla classe 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;
}
I risultati dell'applicazione di XmlTypeAttribute
e SoapTypeAttribute
possono essere osservati quando si esamina la descrizione del servizio, come illustrato nell'esempio seguente.
<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>
L'effetto di XmlRootAttribute
può essere osservato anche nei risultati HTTP GET e HTTP POST come di seguito illustrato.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
Vedere anche
Attività
Procedura: serializzare un oggetto come flusso XML con codifica SOAP
Procedura: eseguire l'override della serializzazione XML con codifica SOAP
Procedura: serializzare un oggetto
Procedura: deserializzare un oggetto
Concetti
Attributi che controllano la serializzazione con codifica SOAP
Introduzione alla serializzazione XML