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.
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
- XML- und SOAP-Serialisierung
- Attribute, die codierte SOAP-Serialisierung steuern
- Vorgehensweise: Serialisieren eines Objekts als SOAP-Encoded XML-Stream
- So geht's: Überschreiben der kodierten SOAP-XML-Serialisierung
- Einführung in die XML-Serialisierung
- Gewusst wie: Serialisieren eines Objekts
- Vorgehensweise: Deserialisieren eines Objekts