Condividi tramite


Serializzazione XML con servizi Web XML

La serializzazione XML rappresenta il meccanismo di trasporto sottostante utilizzato nell'architettura dei servizi Web XML, realizzato dalla classe XmlSerializer. Per controllare il linguaggio XML generato da un servizio Web XML, è possibile applicare gli attributi indicati nelle sezioni 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 utilizzato per creare un servizio Web XML (ASMX). Per ulteriori informazioni sulla creazione di un servizio Web XML, vedere Generazione di servizi Web XML mediante ASP.NET.

Stili letterali e codificati

Il linguaggio XML generato da un servizio Web XML può essere formattato così com'è o in forma codificata, come viene illustrato in Personalizzazione dei messaggi SOAP. Pertanto esistono due serie di attributi che controllano la serializzazione XML. Gli attributi indicati in Attributi che controllano la serializzazione XML sono progettati per il controllo del linguaggio in stile letterale. Gli attributi indicati in Attributi che controllano la serializzazione con codifica SOAP controllano lo stile codificato. Applicando in modo selettivo questi attributi, è possibile personalizzare un'applicazione in modo che restituisca l'uno o l'altro o entrambi gli stili. Inoltre essi possono essere applicati, se opportuno, a valori restituiti e parametri.

Esempio di utilizzo di entrambi gli stili

Quando si crea un servizio Web XML, è possibile utilizzare entrambi gli insiemi di attributi sui metodi. Nell'esempio che segue, la classe denominata MyService contiene due metodi di servizio Web XML, MyLiteralMethod e MyEncodedMethod. Entrambi svolgono la stessa funzione, vale a dire restituire 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, inserire il codice in un file con un'estensione ASMX e inserire il file in una directory virtuale gestita da Internet Information Services (IIS). Da un browser HTML, quale 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
[C#]
<%@ 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 che segue viene chiamato MyLiteralMethod. Il nome dell'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 che segue viene chiamato MyEncodedMethod. Il nome dell'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

È possibile anche applicare attributi a valori restituiti per controllare lo spazio dei nomi, il nome di elemento e così via. Nell'esempio che segue 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
[C#]
    [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 del linguaggio XML simile a quello che 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>
        <MyLiteralMethodResponse xmlns="http://tempuri.org/">
            <BookOrder xmlns="http://www.cohowinery.com">
                <LiteralOrderID>string</LiteralOrderID>
            </BookOrder>
        </MyLiteralMethodResponse>
    </soap:Body>
</soap:Envelope>

Attributi applicati a parametri

È possibile anche applicare attributi a parametri per specificare lo spazio dei nomi, il nome di elemento e così via. Nell'esempio che segue 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
[C#]
    [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, in base alle esigenze, XmlTypeAttribute, XmlRootAttribute e SoapTypeAttribute. Nell'esempio che segue vengono applicati tutti e tre 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
[C#]
[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 visualizzati quando si esamina la descrizione del servizio, come viene illustrato nell'esempio che segue.

    <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, nel modo seguente.

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

Vedere anche

Serializzazione XML | Attributi che controllano la serializzazione con codifica SOAP | Generazione di messaggi SOAP con la serializzazione XML | Introduzione alla serializzazione XML