Serializzazione XML con Servizi Web XMLXML Serialization with XML Web Services

La serializzazione XML è il meccanismo di trasporto sottostante utilizzato nell'architettura dei servizi Web XML, eseguita dalla classe XmlSerializer.XML serialization is the underlying transport mechanism used in the XML Web services architecture, performed by the XmlSerializer class. Per controllare il codice XML generato da un servizio Web XML, è possibile applicare gli attributi elencati in Attributi per il controllo della serializzazione XML e in Attributi per il controllo della serializzazione SOAP codificata alle classi, ai valori restituiti, ai parametri e ai campi di un file usato per creare un servizio Web XML (file con estensione asmx).To control the XML generated by an XML Web service, you can apply the attributes listed in both Attributes That Control XML Serialization and Attributes That Control Encoded SOAP Serialization to the classes, return values, parameters, and fields of a file used to create an XML Web service (.asmx). Per ulteriori informazioni sulla creazione di un servizio Web XML, vedere XML Web Services Using ASP.NET.For more information about creating an XML Web service, see XML Web Services Using ASP.NET.

Stili letterali e codificatiLiteral and Encoded Styles

Il codice XML generato da un servizio Web XML può essere formattato in uno dei due modi, ovvero valore letterale o codificato, come illustrato in personalizzazione della formattazione dei messaggi SOAP.The XML generated by an XML Web service can be formatted in either one of two ways, either literal or encoded, as explained in Customizing SOAP Message Formatting. Esistono pertanto due insiemi di attributi che controllano la serializzazione XML.Therefore there are two sets of attributes that control XML serialization. Gli attributi elencati in Attributi per il controllo della serializzazione XML sono progettati per controllare il codice XML con stile letterale.The attributes listed in Attributes That Control XML Serialization are designed to control literal style XML. Gli attributi elencati in Attributi per il controllo della serializzazione SOAP codificata sono progettati per controllare lo stile codificato.The attributes listed in Attributes That Control Encoded SOAP Serialization control the encoded style. Tramite l'applicazione selettiva di tali attributi, è possibile adattare un'applicazione in modo che restituisca solo uno o entrambi gli stili.By selectively applying these attributes, you can tailor an application to return either, or both styles. Inoltre, questi attributi possono essere applicati (in base alle proprie esigenze) a valori restituiti e parametri.Furthermore, these attributes can be applied (as appropriate) to return values and parameters.

Esempio di utilizzo di entrambi gli stiliExample of Using Both Styles

Durante la creazione di un servizio Web XML, è possibile utilizzare entrambi gli insiemi di attributi sui metodi.When you're creating an XML Web service, you can use both sets of attributes on the methods. Nell'esempio di codice riportato di seguito, la classe denominata MyService contiene due metodi del servizio Web XML, MyLiteralMethod e MyEncodedMethod.In the following code example, the class named MyService contains two XML Web service methods, MyLiteralMethod and MyEncodedMethod. Entrambi i metodi eseguono la stessa funzione: la restituzione di un'istanza della classe Order.Both methods perform the same function: returning an instance of the Order class. Nella classe Order gli attributi XmlTypeAttribute e SoapTypeAttribute sono entrambi applicati al campo OrderID ed entrambi hanno la proprietà ElementName impostata su valori diversi.In the Order class, the XmlTypeAttribute and the SoapTypeAttribute attributes are both applied to the OrderID field, and both attributes have their ElementName property set to different values.

Per eseguire l'esempio, incollare il codice in un file con estensione asmx e posizionare il file in una directory virtuale gestita da Internet Information Services (IIS).To run the example, paste the code into a file with an .asmx extension, and place the file into a virtual directory managed by Internet Information Services (IIS). Da un browser HTML, ad esempio Internet Explorer, digitare il nome del computer, della directory virtuale e del file.From an HTML browser, such as Internet Explorer, type the name of the computer, virtual directory, and 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 riportato di seguito viene chiamato il metodo MyLiteralMethod.The following code example calls MyLiteralMethod. Il nome dell'elemento viene modificato in "LiteralOrderID."The element name is changed to "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 riportato di seguito viene chiamato il metodo MyEncodedMethod.The following code example calls MyEncodedMethod. Il nome dell'elemento è "EncodedOrderID."The element name is "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 ai valori restituitiApplying Attributes to Return Values

È inoltre possibile applicare attributi ai valori restituiti per controllare lo spazio dei nomi, il nome dell'elemento e così via.You can also apply attributes to return values to control the namespace, element name, and so forth. Nell'esempio di codice riportato di seguito viene applicato l'attributo XmlElementAttribute al valore restituito del metodo MyLiteralMethod.The following code example applies the XmlElementAttribute attribute to the return value of the MyLiteralMethod method. Tale operazione consente di controllare lo spazio dei nomi e il nome dell'elemento.Doing so allows you to control the namespace and element name.

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

Se richiamato, il codice restituisce l'XML che assomiglia agli elementi seguenti.When invoked, the code returns XML that resembles the following.

<?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 ai parametriAttributes Applied to Parameters

È inoltre possibile applicare attributi ai parametri per specificare lo spazio dei nomi, il nome dell'elemento e così via.You can also apply attributes to parameters to specify namespace, element name and so forth. Nell'esempio di codice riportato di seguito viene aggiunto un parametro al metodo MyLiteralMethodResponse e viene applicato l'attributo XmlAttributeAttribute al parametro.The following code example adds a parameter to the MyLiteralMethodResponse method, and applies the XmlAttributeAttribute attribute to the parameter. Il nome dell'elemento e lo spazio dei nomi vengono entrambi impostati per il parametro.The element name and namespace are both set for the parameter.

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

La richiesta SOAP dovrebbe essere simile alla seguente.The SOAP request would resemble the following.

<?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 alle classiApplying Attributes to Classes

Se è necessario controllare lo spazio dei nomi di elementi correlati alle classi, è possibile applicare XmlTypeAttribute, XmlRootAttributee SoapTypeAttribute, in base alle proprie esigenze.If you need to control the namespace of elements that correlate to classes, you can apply XmlTypeAttribute, XmlRootAttribute, and SoapTypeAttribute, as appropriate. Nell'esempio di codice riportato di seguito, i tre attributi vengono applicati alla classe Order.The following code example applies all three to the Order class.

<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 visualizzati durante l'esame della descrizione del servizio, come illustrato nell'esempio di codice riportato di seguito.The results of applying the XmlTypeAttribute and SoapTypeAttribute can be seen when you examine the service description, as shown in the following code example.

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

L'effetto di XmlRootAttribute può essere inoltre visualizzato nei risultati di HTTP GET e HTTP POST, come riportato di seguito.The effect of the XmlRootAttribute can also be seen in the HTTP GET and HTTP POST results, as follows.

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

Vedere ancheSee also