Share via


XML-serialisatie met XML-webservices

XML-serialisatie is het onderliggende transportmechanisme dat wordt gebruikt in de XML-webservicesarchitectuur, uitgevoerd door de XmlSerializer klasse. Als u de XML wilt beheren die door een XML-webservice wordt gegenereerd, kunt u de kenmerken toepassen die worden vermeld in beide kenmerken die XML-serialisatie en kenmerken beheren die SOAP-serialisatie bepalen op de klassen, waarden, parameters en velden retourneren van een bestand dat wordt gebruikt om een XML-webservice (.asmx) te maken. Zie XML-webservices met ASP.NET voor meer informatie over het maken van een XML-webservice.

Letterlijke en gecodeerde stijlen

De XML die door een XML-webservice wordt gegenereerd, kan op twee manieren worden opgemaakt, letterlijk of gecodeerd, zoals wordt uitgelegd in het aanpassen van SOAP-berichtopmaak. Daarom zijn er twee sets kenmerken waarmee XML-serialisatie wordt ingesteld. De kenmerken die worden vermeld in Kenmerken die XML-serialisatie bepalen, zijn ontworpen om letterlijke xml-stijl te beheren. De kenmerken die worden vermeld in kenmerken die door SOAP-serialisatie zijn gecodeerd, bepalen de gecodeerde stijl. Door deze kenmerken selectief toe te passen, kunt u een toepassing aanpassen om een van beide of beide stijlen te retourneren. Bovendien kunnen deze kenmerken (indien van toepassing) worden toegepast om waarden en parameters te retourneren.

Voorbeeld van het gebruik van beide stijlen

Wanneer u een XML-webservice maakt, kunt u beide sets kenmerken op de methoden gebruiken. In het volgende codevoorbeeld bevat de klasse met de naam MyService twee XML-webservicemethoden en MyLiteralMethodMyEncodedMethod. Beide methoden voeren dezelfde functie uit: een exemplaar van de Order klasse retourneren. In de Order klasse worden de XmlTypeAttribute en de SoapTypeAttribute kenmerken beide toegepast op het OrderID veld, en beide kenmerken hebben hun ElementName eigenschap ingesteld op verschillende waarden.

Als u het voorbeeld wilt uitvoeren, plakt u de code in een bestand met de extensie .asmx en plaatst u het bestand in een virtuele map die wordt beheerd door Internet Information Services (IIS). Typ in een webbrowser de naam van de computer, de virtuele map en het bestand.

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

In het volgende codevoorbeeld wordt een aanroep uitgevoerd MyLiteralMethod. De elementnaam wordt gewijzigd 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>  

In het volgende codevoorbeeld wordt een aanroep uitgevoerd MyEncodedMethod. De elementnaam 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>  

Kenmerken toepassen op retourwaarden

U kunt ook kenmerken toepassen om waarden te retourneren om de naamruimte, elementnaam enzovoort te beheren. In het volgende codevoorbeeld wordt het XmlElementAttribute kenmerk toegepast op de retourwaarde van de MyLiteralMethod methode. Hierdoor kunt u de naamruimte en elementnaam beheren.

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

Wanneer deze wordt aangeroepen, retourneert de code XML die lijkt op het volgende.

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

Kenmerken die zijn toegepast op parameters

U kunt ook kenmerken toepassen op parameters om naamruimte, elementnaam enzovoort op te geven. In het volgende codevoorbeeld wordt een parameter aan de MyLiteralMethodResponse methode toegevoegd en wordt het XmlAttributeAttribute kenmerk toegepast op de parameter. De elementnaam en naamruimte zijn beide ingesteld voor de 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;  
}

De SOAP-aanvraag ziet er ongeveer als volgt uit.

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

Kenmerken toepassen op klassen

Als u de naamruimte wilt beheren van elementen die correleren met klassen, kunt XmlTypeAttributeXmlRootAttributeu, indien van toepassing, en SoapTypeAttribute, toepassen. In het volgende codevoorbeeld worden alle drie de Order klassen toegepast.

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

De resultaten van het toepassen van de XmlTypeAttribute en SoapTypeAttribute kunnen worden weergegeven wanneer u de servicebeschrijving bekijkt, zoals wordt weergegeven in het volgende codevoorbeeld.

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

Het effect van de XmlRootAttribute gegevens kan als volgt worden weergegeven in de http GET- en HTTP POST-resultaten.

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

Zie ook