Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Bei der XML-Serialisierung handelt es sich um den durch die XmlSerializer-Klasse durchgeführten Transportmechanismus, der Grundlage für die Architektur der XML-Webdienste ist. Zum Steuern des mit einem XML-Webdienst generierten XML-Streams können Sie sowohl die unter Attribute für die Steuerung der XML-Serialisierung als auch die unter Attribute für die Steuerung der Serialisierung von codiertem SOAP aufgelisteten Attribute auf die Klassen, Rückgabewerte, Parameter und Felder einer Datei anwenden, die zum Erstellen eines XML-Webdienstes (.asmx) verwendet wurden. Weitere Informationen zum Erstellen eines XML-Webdienstes finden Sie unter Grundlagen beim Erstellen von XML-Webdiensten mit ASP.NET.
Literalformat und codiertes Format
Der mit einem XML-Webdienst generierte XML-Stream kann entweder literal oder codiert, wie unter Anpassen von SOAP-Meldungen beschrieben, formatiert werden. Daher wird die XML-Serialisierung von zwei Reihen von Attributen gesteuert. Die unter Attribute für die Steuerung der XML-Serialisierung aufgeführten Attribute sind auf die Steuerung von literalem XML-Stream abgestimmt. Durch die unter Attribute für die Steuerung der Serialisierung von codiertem SOAP aufgeführten Attribute wird codierter XML-Stream gesteuert. Eine gezielte Anwendung dieser Attribute ermöglicht das Anpassen einer Anwendung auf die Rückgabe eines der beiden Formate oder beider Formate. Darüber hinaus können diese Attribute ggf. auf Rückgabewerte und Parameter angewendet werden.
Beispiel für beide Formate
Bei der Erstellung eines XML-Webdienstes können Sie beide Reihen von Attributen auf die Methoden anwenden. Im folgenden Beispiel enthält die MyService-Klasse die beiden XML-Webdienstmethoden MyLiteralMethod und MyEncodedMethod. Beide Methoden führen dieselben Funktionen aus: Sie geben eine Instanz der Order-Klasse zurück. In der Order-Klasse werden sowohl das XmlTypeAttribute-Attribut als auch das SoapTypeAttribute-Attribut auf das OrderID-Feld angewendet, wobei verschiedene Werte für die ElementName-Eigenschaft beider Attribute festgelegt wurden.
Um das Beispiel auszuführen, fügen Sie den Code in eine ASMX-Datei ein, und speichern Sie die Datei in einem virtuellen Verzeichnis, das durch Internet-Informationsdienste (IIS) verwaltet wird. Geben Sie über einen HTML-Browser wie Internet Explorer den Namen des Computers, das virtuelle Verzeichnis und die 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
[C#]
<%@ 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;
}
}
Im folgenden Beispiel wird MyLiteralMethod aufgerufen. Beachten Sie, dass der Elementname in LiteralOrderID geändert wurde.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethodResponse xmlns="http://tempuri.org/">
<MyLiteralMethodResult>
<LiteralOrderID>string</LiteralOrderID>
</MyLiteralMethodResult>
</MyLiteralMethodResponse>
</soap:Body>
</soap:Envelope>
Im folgenden Beispiel wird die MyEncodedMethod-Methode aufgerufen. Beachten Sie, dass der Elementname EncodedOrderID lautet.
<?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="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="https://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 Attribute auch auf Rückgabewerte anwenden, um Namespace, Elementname usw. zu steuern. Im folgenden Beispiel 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
[C#]
[return: XmlElement(Namespace = "http://www.cohowinery.com",
ElementName = "BookOrder")]
[WebMethod][SoapDocumentMethod]
public Order MyLiteralMethod(){
Order myOrder = new Order();
return myOrder;
}
Wird er aufgerufen, gibt der Code einen XML-Stream aus, der dem folgenden Beispiel gleicht.
<?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="https://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>
Auf Parameter angewendete Attribute
Sie können Attribute auch auf Parameter anwenden, um Namespace, Elementname usw. festzulegen. Im folgenden Beispiel wird der MyLiteralMethodResponse-Methode ein Parameter hinzugefügt, auf den dann das XmlAttributeAttribute-Attribut angewendet wird. Sowohl Elementname als auch Namespace sind für den Parameter festgelegt.
<WebMethod, SoapDocumentMethod> _
public Function MyLiteralMethod(<XmlElement _
("MyOrderID", Namespace:="https://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
[C#]
[return: XmlElement(Namespace = "http://www.cohowinery.com",
ElementName = "BookOrder")]
[WebMethod][SoapDocumentMethod]
public Order MyLiteralMethod([XmlElement("MyOrderID",
Namespace="https://www.microsoft.com")] string ID){
Order myOrder = new Order();
myOrder.OrderID = ID;
return myOrder;
}
Die SOAP-Anforderung würde mit dem folgenden Beispiel vergleichbar sein.
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyLiteralMethod xmlns="http://tempuri.org/">
<MyOrderID xmlns="https://www.microsoft.com">string</MyOrderID>
</MyLiteralMethod>
</soap:Body>
</soap:Envelope>
Anwenden von Attributen auf Klassen
Um den Namespace von Elementen zu steuern, die in Beziehung zu Klassen stehen, können Sie dementsprechend XmlTypeAttribute, XmlRootAttribute, und SoapTypeAttribute anwenden. Im folgenden Beispiel 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
[C#]
[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 werden bei Untersuchung der Servicebeschreibung deutlich, wie in folgendem Beispiel gezeigt wird.
<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>
Die Auswirkung des XmlRootAttribute-Attributs wird auch anhand der HTTP GET- und HTTP POST-Ergebnisse deutlich, wie im Folgendem gezeigt.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
Siehe auch
XML-Serialisierung | Attribute für die Steuerung der Serialisierung von codiertem SOAP | Generieren von SOAP-Meldungen mit der XML-Serialisierung | Einführung in die XML-Serialisierung