Freigeben über


XML-Serialisierung mit XML-Webdiensten

Die XML-Serialisierung ist der zugrunde liegende Transportmechanismus, der in der XML-Webdienstarchitektur verwendet wird, die von der XmlSerializer Klasse ausgeführt wird. Um das von einem XML-Webdienst generierte XML zu steuern, können Sie die Attribute, die in beiden Attributen aufgeführt sind, die die XML-Serialisierung steuern und Attribute, die die codierte SOAP-Serialisierung steuern, auf die Klassen, Rückgabewerte, Parameter und Felder einer Datei anwenden, die zur Erstellung eines XML-Webdiensts (.asmx) verwendet wird. Weitere Informationen zum Erstellen eines XML-Webdiensts finden Sie unter XML-Webdienste mit ASP.NET.

Literalformat und codiertes Format

Der von einem XML-Webdienst generierte XML-Code kann auf eine von zwei Arten formatiert werden, entweder literal oder codiert, wie im Anpassen der SOAP-Nachrichtenformatierung erläutert. Daher gibt es zwei Sätze von Attributen, die die XML-Serialisierung steuern. Die attribute, die in Attributes That Control XML Serialization aufgeführt sind, sind für die Steuerung von XML-Code im Literalstil konzipiert. Die in Attributes That Control Encoded SOAP Serialization aufgeführten Attribute kontrollieren den codierten Stil. Durch selektives Anwenden dieser Attribute können Sie eine Anwendung so anpassen, dass sie entweder oder beide Formatvorlagen zurückgibt. Darüber hinaus können diese Attribute (entsprechend) angewendet werden, um Werte und Parameter zurückzugeben.

Beispiel für die Verwendung beider Stile

Wenn Sie einen XML-Webdienst erstellen, können Sie beide Attribute für die Methoden verwenden. Im folgenden Codebeispiel enthält die benannte MyService Klasse zwei XML-Webdienstmethoden MyLiteralMethod und MyEncodedMethod. Beide Methoden führen dieselbe Funktion aus: Zurückgeben einer Instanz der Order Klasse. In der Order Klasse werden sowohl die XmlTypeAttribute Attribute als auch die SoapTypeAttribute Attribute auf das OrderID Feld angewendet, und beide Attribute haben ihre ElementName Eigenschaft auf unterschiedliche Werte festgelegt.

Zum Ausführen des Beispiels fügen Sie den Code in eine Datei mit der Erweiterung ASMX ein, und platzieren Sie die Datei in einem virtuellen Verzeichnis, das von Internetinformationsdienste (INTERNET Information Services, IIS) verwaltet wird. Geben Sie in einem Webbrowser den Namen des Computers, des virtuellen Verzeichnisses und der Datei ein.

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

Das folgende Codebeispiel ruft MyLiteralMethod auf. Der Elementname wird in "LiteralOrderID" geändert.

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

Das folgende Codebeispiel ruft MyEncodedMethod auf. Der Elementname lautet "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>  

Anwenden von Attributen auf Rückgabewerte

Sie können auch Attribute anwenden, um Werte zurückzugeben, um den Namespace, den Elementnamen usw. zu steuern. Im folgenden Codebeispiel wird das XmlElementAttribute Attribut auf den Rückgabewert der MyLiteralMethod Methode angewendet. Auf diese Weise können Sie den Namespace und den Elementnamen steuern.

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

Beim Aufrufen gibt der Code XML-Code zurück, der dem folgenden ähnelt.

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

Attribute, die auf Parameter angewendet werden

Sie können auch Attribute auf Parameter anwenden, um Namespace, Elementname usw. anzugeben. Im folgenden Codebeispiel wird der MyLiteralMethodResponse Methode ein Parameter hinzugefügt und das XmlAttributeAttribute Attribut auf den Parameter angewendet. Der Elementname und der Namespace sind für den Parameter festgelegt.

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

Die SOAP-Anforderung würde wie folgt aussehen.

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

Anwenden von Attributen auf Klassen

Wenn Sie den Namespace von Elementen steuern müssen, die mit Klassen korrelieren, können Sie XmlTypeAttribute, XmlRootAttribute und SoapTypeAttribute als angemessen anwenden. Im folgenden Codebeispiel werden alle drei auf die Order Klasse angewendet.

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

Die Ergebnisse der Anwendung von XmlTypeAttribute und SoapTypeAttribute sind sichtbar, wenn Sie die Dienstbeschreibung untersuchen, wie im folgenden Codebeispiel gezeigt.

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

Der Effekt der XmlRootAttribute Funktion kann auch in den HTTP GET- und HTTP POST-Ergebnissen wie folgt angezeigt werden.

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

Siehe auch