Esporta (0) Stampa
Espandi tutto

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="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="http://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="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>

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.

    [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="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>

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.

    [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;
    } 

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="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>

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("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

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft