Partager via


Sérialisation XML avec des services web XML

La sérialisation XML est le mécanisme de transport sous-jacent utilisé dans l’architecture des services Web XML, effectué par la XmlSerializer classe. Pour contrôler le code XML généré par un service web XML, vous pouvez appliquer les attributs répertoriés dans les attributs qui contrôlent la sérialisation XML et les attributs qui contrôlent la sérialisation SOAP encodée aux classes, aux valeurs de retour, aux paramètres et aux champs d’un fichier utilisé pour créer un service web XML (.asmx). Pour plus d’informations sur la création d’un service web XML, consultez Services Web XML à l’aide de ASP.NET.

Styles littéraux et encodés

Le code XML généré par un service web XML peut être mis en forme de l’une des deux manières, littérale ou encodée, comme expliqué dans la personnalisation de la mise en forme des messages SOAP. Par conséquent, il existe deux ensembles d’attributs qui contrôlent la sérialisation XML. Les attributs répertoriés dans Attributs qui contrôlent la sérialisation XML sont conçus pour contrôler le code XML de style littéral. Les attributs répertoriés dans Attributs qui contrôlent la sérialisation SOAP encodée contrôlent le style codé. En appliquant de manière sélective ces attributs, vous pouvez adapter une application pour retourner l’un ou l’autre des styles. De plus, ces attributs peuvent être appliqués (le cas échéant) pour retourner des valeurs et des paramètres.

Exemple d’utilisation des deux styles

Lorsque vous créez un service Web XML, vous pouvez utiliser les deux ensembles d’attributs sur les méthodes. Dans l’exemple de code suivant, la classe nommée MyService contient deux méthodes de service Web XML et MyLiteralMethodMyEncodedMethod. Les deux méthodes effectuent la même fonction : renvoyer une instance de la Order classe. Dans la Order classe, les XmlTypeAttribute attributs et les SoapTypeAttribute attributs sont appliqués au OrderID champ, et les deux attributs ont leur ElementName propriété définie sur des valeurs différentes.

Pour exécuter l’exemple, collez le code dans un fichier avec une extension .asmx et placez le fichier dans un répertoire virtuel géré par Internet Information Services (IIS). À partir d’un navigateur web, tapez le nom de l’ordinateur, du répertoire virtuel et du fichier.

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

L’exemple de code suivant appelle MyLiteralMethod. Le nom de l’élément est remplacé par « 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>  

L’exemple de code suivant appelle MyEncodedMethod. Le nom de l’élément est « 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>  

Application d’attributs à des valeurs de retour

Vous pouvez également appliquer des attributs pour retourner des valeurs pour contrôler l’espace de noms, le nom de l’élément, etc. L’exemple de code suivant applique l’attribut XmlElementAttribute à la valeur de retour de la MyLiteralMethod méthode. Cela vous permet de contrôler l’espace de noms et le nom de l’élément.

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

Lorsqu’il est appelé, le code retourne du code XML semblable à ce qui suit.

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

Attributs appliqués aux paramètres

Vous pouvez également appliquer des attributs à des paramètres pour spécifier l’espace de noms, le nom de l’élément, etc. L’exemple de code suivant ajoute un paramètre à la MyLiteralMethodResponse méthode et applique l’attribut XmlAttributeAttribute au paramètre. Le nom de l’élément et l’espace de noms sont tous les deux définis pour le paramètre.

<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 requête SOAP ressemble à ce qui suit.

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

Application d’attributs à des classes

Si vous devez contrôler l’espace de noms des éléments qui sont corrélés aux classes, vous pouvez appliquer XmlTypeAttribute, XmlRootAttributeet SoapTypeAttribute, le cas échéant. L’exemple de code suivant applique les trois à la 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;  
}  

Les résultats de l'application des XmlTypeAttribute et SoapTypeAttribute sont visibles lorsque vous examinez la description du service, comme illustré dans l'exemple de code suivant.

<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’effet de la requête XmlRootAttribute peut également être vu dans les résultats HTTP GET et HTTP POST, comme suit.

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

Voir aussi