Serializace XML pomocí webových služeb XML
Serializace XML je základní přenos mechanismus použít v architektuře XML webových služeb, prováděné XmlSerializer třídy. Chcete-li řídit XML vygenerované webovou službou XML, můžete použít atributy uvedené v atributech, které řídí serializaci XML a atributy, které řídí kódované serializace SOAP třídy, návratové hodnoty, parametry a pole souboru sloužící k vytvoření webové služby XML (.asmx). Další informace o vytvoření webové služby XML naleznete v tématu Webové služby XML pomocí ASP.NET.
Literál a kódovaného stylů
Xml vygenerovaný webovou službou XML lze formátovat jedním ze dvou způsobů, buď literálem nebo kódováním, jak je vysvětleno v tématu Přizpůsobení formátování zprávy SOAP. Proto existují dvě sady atributů, které řídí serializace XML. Atributy uvedené v atributech, které řídí xml serializace jsou navrženy pro řízení literál styl XML. Atributy uvedené v atributech, které řídí kódované SOAP Serializace řídí kódovaný styl. Použitím selektivní tyto atributy, můžete přizpůsobit aplikace má být vrácena, obojím stylů. Kromě toho tyto atributy lze použít (v závislosti) má být vrácen hodnoty a parametry.
Příklad použití obou stylů
Při vytváření webové služby XML, můžete použít obě sady atributů pro metody. V následujícím příkladu kódu s názvem třídy MyService
obsahuje dvě metody webové služby XML, MyLiteralMethod
a MyEncodedMethod
. Obě metody provádět má stejnou funkci: vrací instanci Order
třídy. Order
Ve třídě XmlTypeAttributeSoapTypeAttribute se oba atributy použijí na OrderID
pole a oba atributy mají jejich ElementName
vlastnost nastavenou na různé hodnoty.
Chcete-li spustit příklad, vložte kód do soubor s příponou .asmx a umístění souboru do virtuálního adresáře spravované Internet Information Services (IIS). Ve webovém prohlížeči zadejte název počítače, virtuálního adresáře a souboru.
<%@ 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;
}
}
Následující příklad volá kódu MyLiteralMethod
. Název elementu se změní na "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>
Následující příklad volá kódu MyEncodedMethod
. Název elementu je "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>
Použití atributů vracet hodnoty
Můžete také použít atributy se mají vrátit hodnoty, které chcete určit obor názvů, název elementu a tak dále. Následující příklad kódu se vztahuje XmlElementAttribute
atribut návratovou hodnotu MyLiteralMethod
metody. To vám umožní název oboru názvů a elementu ovládacího prvku.
<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;
}
Při vyvolání, vrátí kód XML, který se podobá níže.
<?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>
Atributy použité na parametry
Můžete také použít atributy k parametrům Chcete-li určit obor názvů, název elementu a tak dále. Následující příklad kódu přidá parametr, aby MyLiteralMethodResponse
v případě metody a použije XmlAttributeAttribute
atribut parametru. Název elementu a obor názvů jsou obě sady pro parametr.
<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;
}
Požadavek SOAP bude vypadat takto.
<?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>
Použití atributů na třídy
Pokud je nutné určit obor názvů elementů, které se vztahují na třídy, můžete použít XmlTypeAttribute
, XmlRootAttribute
, a SoapTypeAttribute
v případě potřeby. Následující příklad kódu se vztahuje na všechny tři Order
třídy.
<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;
}
Výsledky používání XmlTypeAttribute
a SoapTypeAttribute
si můžete prohlédnout při kontrole popisu služby, jak je znázorněno v následujícím příkladu kódu.
<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>
Vliv XmlRootAttribute
můžete také prohlédnout ve výsledcích HTTP GET a POST protokolu HTTP následujícím způsobem.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>
Viz také
- Serializace XML a SOAP
- Seznam atributů řídících serializaci zakódovanou v protokolu SOAP
- Postupy: Serializace objektu jako XML streamu zakódovaného v protokolu SOAP
- Postupy: Přepsání serializace XML zakódované v protokolu SOAP
- Představení serializace XML
- Postupy: Serializace objektu
- Postupy: Deserializace objektu