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 MyLiteralMethod
MyEncodedMethod
. 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 XmlTypeAttribute
XmlRootAttribute
u, 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
- XML- en SOAP-serialisatie
- Kenmerken waarmee gecodeerde SOAP-serialisatie wordt beheerd
- Procedure: Een object serialiseren als een SOAP-gecodeerde XML-stream
- Procedure: Gecodeerde SOAP XML-serialisatie overschrijven
- Inleiding tot XML-serialisatie
- Procedure: Een object serialiseren
- Procedure: Een object deserialiseren