Serialisasi XML dengan Layanan Web XML
Serialisasi XML adalah mekanisme transportasi yang mendasar yang digunakan dalam arsitektur layanan Web XML, yang dilakukan oleh kelas XmlSerializer. Untuk mengontrol XML yang dihasilkan oleh layanan Web XML, Anda dapat menerapkan atribut yang tercantum dalam Atribut yang Mengontrol Serialisasi XML dan Atribut yang Mengontrol Serialisasi SOAP yang Dikodekan ke kelas, nilai balik, parameter, dan bidang file yang digunakan untuk membuat layanan Web XML (.asmx). Untuk informasi selengkapnya tentang membuat layanan Web XML, lihat Layanan Web XML Menggunakan ASP.NET.
Gaya Literal dan Dikodekan
XML yang dihasilkan oleh layanan Web XML dapat diformat dengan salah satu dari dua cara, baik literal atau dikodekan, seperti yang dijelaskan dalam Mengkustomisasi Pemformatan Pesan SOAP. Oleh karena itu ada dua set atribut yang mengontrol serialisasi XML. Atribut yang tercantum dalam Atribut yang Mengontrol Serialisasi XML dirancang untuk mengontrol XML gaya literal. Atribut yang tercantum dalam Atribut yang Mengontrol Serialisasi SOAP Yang Dikodekan mengontrol gaya yang dikodekan. Dengan menerapkan atribut ini secara selektif, Anda dapat menyesuaikan aplikasi untuk mengembalikan salah satu atau kedua gaya. Selain itu, atribut ini dapat diterapkan (sesuai kebutuhan) untuk nilai balik dan parameter.
Contoh Penggunaan Kedua Gaya
Saat membuat layanan Web XML, Anda bisa menggunakan kedua set atribut pada metode. Dalam contoh kode berikut, kelas bernama MyService
berisi dua metode layanan Web XML, MyLiteralMethod
dan MyEncodedMethod
. Kedua metode melakukan fungsi yang sama: mengembalikan instans kelas Order
. Di kelas Order
, atribut XmlTypeAttribute dan SoapTypeAttribute diterapkan ke bidang OrderID
, dan kedua atribut memiliki properti yang diatur ElementName
ke nilai yang berbeda.
Untuk menjalankan contoh, tempelkan kode ke dalam file dengan ekstensi .asmx, dan tempatkan file ke direktori virtual yang dikelola oleh Internet Information Services (IIS). Dari browser web, ketik nama komputer, direktori virtual, dan file.
<%@ 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;
}
}
Contoh kode berikut memanggil MyLiteralMethod
. Nama elemen diubah menjadi "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>
Contoh kode berikut memanggil MyEncodedMethod
. Nama elemen adalah "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>
Menerapkan Atribut untuk Nilai Balik
Anda juga dapat menerapkan atribut untuk nilai balik untuk mengontrol namespace layanan, nama elemen, dan sebagainya. Contoh kode berikut menerapkan XmlElementAttribute
atribut ke nilai balik MyLiteralMethod
metode. Melakukannya memungkinkan Anda mengontrol namespace layanan dan nama elemen.
<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;
}
Saat dipanggil, kode mengembalikan XML yang menyerupai berikut ini.
<?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>
Atribut Diterapkan ke Parameter
Anda juga dapat menerapkan atribut ke parameter untuk menentukan namespace layanan, nama elemen, dan sebagainya. Contoh kode berikut menambahkan parameter ke MyLiteralMethodResponse
metode, dan menerapkan XmlAttributeAttribute
atribut ke parameter. Nama elemen dan namespace layanan diatur untuk 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;
}
Permintaan SOAP akan menyerupai berikut ini.
<?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>
Menerapkan Atribut ke Kelas
Jika Anda perlu mengontrol namespace layanan elemen yang berkorelasi dengan kelas, Anda dapat menerapkan XmlTypeAttribute
, XmlRootAttribute
, dan SoapTypeAttribute
, sesuai kebutuhan. Contoh kode berikut menerapkan ketiganya ke Order
kelas.
<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;
}
Hasil penerapan XmlTypeAttribute
dan SoapTypeAttribute
dapat dilihat saat Anda memeriksa deskripsi layanan, seperti yang ditunjukkan dalam contoh kode berikut.
<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>
Efek dari XmlRootAttribute
juga dapat dilihat dalam hasil HTTP GET dan HTTP POST, sebagai berikut.
<?xml version="1.0" encoding="utf-8"?>
<BookOrderForm xmlns="http://tempuri.org/">
<LiteralOrderID>string</LiteralOrderID>
</BookOrderForm>