Cette documentation est archivée et n’est pas conservée.

Sérialisation XML à l'aide 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 classe XmlSerializer. Pour contrôler le code XML généré par un service Web XML, vous pouvez appliquer les attributs mentionnés dans les rubriques Attributs qui contrôlent la sérialisation XML et Attributs qui contrôlent la sérialisation codée en SOAP aux classes, valeurs de retour, paramètres et 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, voir Services Web XML avec ASP.NET.

Styles codé et littéral

Le code XML généré par un service Web XML peut être mis en forme des deux manières suivantes : soit de manière littérale, soit de manière codée, selon les explications fournies dans Personnalisation de la mise en forme des messages SOAP. Il existe donc deux ensembles d'attributs qui contrôlent la sérialisation XML. Les attributs répertoriés dans la rubrique 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 la rubrique Attributs qui contrôlent la sérialisation codée en SOAP contrôlent le style codé. En appliquant ces attributs de manière sélective, vous pouvez personnaliser une application pour qu'elle retourne l'un ou l'autre, ou les deux styles. De plus, ces attributs peuvent être appliqués (selon les cas) pour retourner des valeurs et des paramètres.

Exemple d'emploi des deux styles

Lorsque vous créez un service Web XML, vous pouvez utiliser les deux ensembles d'attributs sur les méthodes. Dans le code exemple qui suit, la classe nommée MyService contient deux méthodes de service Web XML, MyLiteralMethod et MyEncodedMethod. Ces deux méthodes ont la même fonction : renvoyer une instance de la classe Order. Dans la classe Order, les attributs XmlTypeAttribute et SoapTypeAttribute sont tous deux appliqués au champ OrderID et ont tous deux des valeurs différentes attribuées à leur propriété ElementName.

Pour exécuter le code exemple, collez-le dans un fichier avec une extension .asmx et placez ce fichier dans un répertoire virtuel géré par les services IIS (Internet Information Services). À partir d'un navigateur HTML tel que Internet Explorer, tapez le nom de l'ordinateur, du répertoire virtuel et le nom du fichier.

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

Le code exemple qui suit appelle MyLiteralMethod. Le nom d'é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>

Le code exemple qui suit appelle MyEncodedMethod. Le nom d'élément est "EncodeOrderID".

<?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 des attributs aux valeurs de retour

Vous pouvez également appliquer des attributs aux valeurs de retour pour contrôler l'espace de noms, le nom d'élément et ainsi de suite. Le code exemple qui suit applique l'attribut XmlElementAttribute à la valeur de retour de la méthode MyLiteralMethod. Cette pratique vous permet de contrôler l'espace de noms et le nom d'élément.

    [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 un code XML qui 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>
        <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 aux paramètres pour spécifier l'espace de noms, le nom d'élément et ainsi de suite. Le code exemple qui suit permet d'ajouter un paramètre à la méthode MyLiteralMethodResponse et d'appliquer l'attribut XmlAttributeAttribute au paramètre. Le nom d'élément et d'espace de noms sont tous deux définis pour le paramètre.

    [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 demande 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 des attributs aux classes

Si vous avez besoin de contrôler l'espace de noms des éléments qui correspondent aux classes, vous pouvez appliquer XmlTypeAttribute, XmlRootAttribute et SoapTypeAttribute selon vos besoins. Le code exemple qui suit applique ces trois attributs à la 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;
}

Les résultats de l'application de XmlTypeAttribute et SoapTypeAttribute se voient à l'examen de la description de service, comme le montre le code exemple.

    <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'effet de XmlRootAttribute est également visible dans les résultats HTTP GET et HTTP POST, comme illustré ci-dessous.

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

Voir aussi

Afficher: