Bagikan melalui


Serialisasi XML dengan Xml Web Services

Serialisasi XML adalah mekanisme transportasi yang mendasar yang digunakan dalam arsitektur layanan Web XML, yang dilakukan oleh XmlSerializer kelas . 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, mengembalikan nilai, 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 harfiah atau dikodekan, seperti yang dijelaskan dalam Menyesuaikan 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) untuk mengembalikan nilai dan parameter.

Contoh Penggunaan Kedua Gaya

Saat membuat layanan Web XML, Anda dapat 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 Order kelas. Dalam kelas Order, atribut XmlTypeAttribute dan SoapTypeAttribute diterapkan pada bidang OrderID, dan kedua atribut memiliki properti ElementName yang diatur 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 Mengembalikan Nilai

Anda juga dapat menerapkan atribut untuk mengembalikan nilai untuk mengontrol namespace, nama elemen, dan sebagainya. Contoh kode berikut menerapkan atribut XmlElementAttribute ke nilai pengembalian metode MyLiteralMethod. Melakukannya memungkinkan Anda mengontrol namespace 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, nama elemen, dan sebagainya. Contoh kode berikut menambahkan parameter ke MyLiteralMethodResponse metode , dan menerapkan XmlAttributeAttribute atribut ke parameter . Nama elemen dan namespace keduanya telah ditetapkan 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 elemen yang berkorelasi dengan kelas, Anda dapat menerapkan XmlTypeAttribute, , XmlRootAttributedan SoapTypeAttribute, yang sesuai. 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>

Efeknya XmlRootAttribute juga dapat dilihat di 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