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>  

Lihat juga