Menggunakan Layanan Web ASP.NET (ASMX)
ASMX menyediakan kemampuan untuk membangun layanan web yang mengirim pesan menggunakan Simple Object Access Protocol (SOAP). SOAP adalah protokol independen platform dan independen bahasa untuk membangun dan mengakses layanan web. Konsumen layanan ASMX tidak perlu tahu apa pun tentang platform, model objek, atau bahasa pemrograman yang digunakan untuk mengimplementasikan layanan. Mereka hanya perlu memahami cara mengirim dan menerima pesan SOAP. Artikel ini menunjukkan cara menggunakan layanan SOAP ASMX dari aplikasi Xamarin.Forms .
Pesan SOAP adalah dokumen XML yang berisi elemen berikut:
- Elemen akar bernama Amplop yang mengidentifikasi dokumen XML sebagai pesan SOAP.
- Elemen Header opsional yang berisi informasi khusus aplikasi seperti data autentikasi. Jika elemen Header ada, elemen tersebut harus menjadi elemen turunan pertama dari elemen Amplop.
- Elemen Isi yang diperlukan yang berisi pesan SOAP yang ditujukan untuk penerima.
- Elemen Kesalahan opsional yang digunakan untuk menunjukkan pesan kesalahan. Jika elemen Kesalahan ada, elemen tersebut harus merupakan elemen turunan dari elemen Isi.
SOAP dapat beroperasi melalui banyak protokol transportasi, termasuk HTTP, SMTP, TCP, dan UDP. Namun, layanan ASMX hanya dapat beroperasi melalui HTTP. Platform Xamarin mendukung implementasi SOAP 1.1 standar melalui HTTP, dan ini termasuk dukungan untuk banyak konfigurasi layanan ASMX standar.
Sampel ini mencakup aplikasi seluler yang berjalan pada perangkat fisik atau emulasi, dan layanan ASMX yang menyediakan metode untuk mendapatkan, menambahkan, mengedit, dan menghapus data. Saat aplikasi seluler dijalankan, aplikasi tersebut terhubung ke layanan ASMX yang dihosting secara lokal seperti yang ditunjukkan pada cuplikan layar berikut:
Catatan
Di iOS 9 dan yang lebih besar, App Transport Security (ATS) memberlakukan koneksi aman antara sumber daya internet (seperti server ujung belakang aplikasi) dan aplikasi, sehingga mencegah pengungkapan informasi sensitif yang tidak disengaja. Karena ATS diaktifkan secara default di aplikasi yang dibangun untuk iOS 9, semua koneksi akan tunduk pada persyaratan keamanan ATS. Jika koneksi tidak memenuhi persyaratan ini, koneksi akan gagal dengan pengecualian.
ATS dapat ditolak jika tidak dimungkinkan untuk menggunakan HTTPS
protokol dan komunikasi yang aman untuk sumber daya internet. Ini dapat dicapai dengan memperbarui file Info.plist aplikasi. Untuk informasi selengkapnya, lihat Keamanan Transportasi Aplikasi.
Menggunakan layanan web
Layanan ASMX menyediakan operasi berikut:
Operasi | Deskripsi | Parameter |
---|---|---|
GetTodoItems | Mendapatkan daftar item yang harus dilakukan | |
CreateTodoItem | Membuat item tugas baru | TodoItem berseri XML |
EditTodoItem | Memperbarui item yang harus dilakukan | TodoItem berseri XML |
DeleteTodoItem | Menghapus item yang harus dilakukan | TodoItem berseri XML |
Untuk informasi selengkapnya tentang model data yang digunakan dalam aplikasi, lihat Memodelkan data.
Membuat proksi TodoService
Kelas proksi, yang disebut TodoService
, memperluas SoapHttpClientProtocol
dan menyediakan metode untuk berkomunikasi dengan layanan ASMX melalui HTTP. Proksi dihasilkan dengan menambahkan referensi web ke setiap proyek khusus platform di Visual Studio 2019 atau Visual Studio 2017. Referensi web menghasilkan metode dan peristiwa untuk setiap tindakan yang ditentukan dalam dokumen Web Services Description Language (WSDL) layanan.
Misalnya, GetTodoItems
tindakan layanan menghasilkan GetTodoItemsAsync
metode dan GetTodoItemsCompleted
peristiwa di proksi. Metode yang dihasilkan memiliki jenis pengembalian yang batal dan memanggil GetTodoItems
tindakan pada kelas induk SoapHttpClientProtocol
. Ketika metode yang dipanggil menerima respons dari layanan, metode tersebut GetTodoItemsCompleted
akan mengaktifkan peristiwa dan menyediakan data respons dalam properti peristiwa Result
.
Membuat implementasi ISoapService
Untuk mengaktifkan proyek lintas platform bersama untuk bekerja dengan layanan, sampel menentukan ISoapService
antarmuka, yang mengikuti model pemrograman asinkron Tugas di C#. Setiap platform mengimplementasikan ISoapService
untuk mengekspos proksi khusus platform. Sampel menggunakan TaskCompletionSource
objek untuk mengekspos proksi sebagai antarmuka asinkron tugas. Detail tentang penggunaan TaskCompletionSource
ditemukan dalam implementasi setiap jenis tindakan di bagian di bawah ini.
Sampel SoapService
:
- Membuat instans
TodoService
sebagai instans tingkat kelas - Membuat koleksi yang dipanggil
Items
untuk menyimpanTodoItem
objek - Menentukan titik akhir kustom untuk properti opsional
Url
padaTodoService
public class SoapService : ISoapService
{
ASMXService.TodoService todoService;
public List<TodoItem> Items { get; private set; } = new List<TodoItem>();
public SoapService ()
{
todoService = new ASMXService.TodoService ();
todoService.Url = Constants.SoapUrl;
...
}
}
Membuat objek transfer data
Aplikasi sampel menggunakan kelas untuk memodelkan TodoItem
data. Untuk menyimpan TodoItem
item di layanan web, item harus terlebih dahulu dikonversi ke jenis proksi yang dihasilkan TodoItem
. Ini dicapai dengan metode , seperti yang ToASMXServiceTodoItem
ditunjukkan dalam contoh kode berikut:
ASMXService.TodoItem ToASMXServiceTodoItem (TodoItem item)
{
return new ASMXService.TodoItem {
ID = item.ID,
Name = item.Name,
Notes = item.Notes,
Done = item.Done
};
}
Metode ini membuat instans baru ASMService.TodoItem
, dan mengatur setiap properti ke properti yang identik dari TodoItem
instans.
Demikian pula, ketika data diambil dari layanan web, data harus dikonversi dari jenis proksi yang dihasilkan TodoItem
menjadi TodoItem
instans. Ini dicapai dengan metode , seperti yang FromASMXServiceTodoItem
ditunjukkan dalam contoh kode berikut:
static TodoItem FromASMXServiceTodoItem (ASMXService.TodoItem item)
{
return new TodoItem {
ID = item.ID,
Name = item.Name,
Notes = item.Notes,
Done = item.Done
};
}
Metode ini mengambil data dari jenis proksi yang dihasilkan TodoItem
dan mengaturnya dalam instans yang baru dibuat TodoItem
.
Mengambil data
Antarmuka ISoapService
mengharapkan RefreshDataAsync
metode untuk mengembalikan Task
dengan koleksi item. Namun, metode mengembalikan TodoService.GetTodoItemsAsync
kekosongan. Untuk memenuhi pola antarmuka, Anda harus memanggil GetTodoItemsAsync
, menunggu GetTodoItemsCompleted
peristiwa diaktifkan, dan mengisi koleksi. Ini memungkinkan Anda mengembalikan koleksi yang valid ke UI.
Contoh di bawah ini membuat baru TaskCompletionSource
, memulai panggilan asinkron dalam RefreshDataAsync
metode , dan menunggu yang Task
disediakan oleh TaskCompletionSource
. Ketika penanganan TodoService_GetTodoItemsCompleted
aktivitas dipanggil, ia mengisi Items
koleksi dan memperbarui TaskCompletionSource
:
public class SoapService : ISoapService
{
TaskCompletionSource<bool> getRequestComplete = null;
...
public SoapService()
{
...
todoService.GetTodoItemsCompleted += TodoService_GetTodoItemsCompleted;
}
public async Task<List<TodoItem>> RefreshDataAsync()
{
getRequestComplete = new TaskCompletionSource<bool>();
todoService.GetTodoItemsAsync();
await getRequestComplete.Task;
return Items;
}
private void TodoService_GetTodoItemsCompleted(object sender, ASMXService.GetTodoItemsCompletedEventArgs e)
{
try
{
getRequestComplete = getRequestComplete ?? new TaskCompletionSource<bool>();
Items = new List<TodoItem>();
foreach (var item in e.Result)
{
Items.Add(FromASMXServiceTodoItem(item));
}
getRequestComplete?.TrySetResult(true);
}
catch (Exception ex)
{
Debug.WriteLine(@"\t\tERROR {0}", ex.Message);
}
}
...
}
Untuk informasi selengkapnya, lihat Model Pemrograman Asinkron dan TPL dan Pemrograman Asinkron .NET Framework Tradisional.
Membuat atau mengedit data
Saat membuat atau mengedit data, Anda harus menerapkan metode .ISoapService.SaveTodoItemAsync
Metode ini mendeteksi apakah TodoItem
adalah item baru atau yang diperbarui dan memanggil metode yang sesuai pada todoService
objek. Penanganan CreateTodoItemCompleted
aktivitas dan EditTodoItemCompleted
juga harus diimplementasikan sehingga Anda tahu kapan todoService
telah menerima respons dari layanan ASMX (ini dapat digabungkan menjadi satu handler karena mereka melakukan operasi yang sama). Contoh berikut menunjukkan implementasi antarmuka dan penanganan aktivitas, serta objek yang TaskCompletionSource
digunakan untuk beroperasi secara asinkron:
public class SoapService : ISoapService
{
TaskCompletionSource<bool> saveRequestComplete = null;
...
public SoapService()
{
...
todoService.CreateTodoItemCompleted += TodoService_SaveTodoItemCompleted;
todoService.EditTodoItemCompleted += TodoService_SaveTodoItemCompleted;
}
public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
try
{
var todoItem = ToASMXServiceTodoItem(item);
saveRequestComplete = new TaskCompletionSource<bool>();
if (isNewItem)
{
todoService.CreateTodoItemAsync(todoItem);
}
else
{
todoService.EditTodoItemAsync(todoItem);
}
await saveRequestComplete.Task;
}
catch (SoapException se)
{
Debug.WriteLine("\t\t{0}", se.Message);
}
catch (Exception ex)
{
Debug.WriteLine("\t\tERROR {0}", ex.Message);
}
}
private void TodoService_SaveTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
saveRequestComplete?.TrySetResult(true);
}
...
}
Menghapus data
Menghapus data memerlukan implementasi serupa. TaskCompletionSource
Tentukan , terapkan penanganan aktivitas, dan ISoapService.DeleteTodoItemAsync
metode :
public class SoapService : ISoapService
{
TaskCompletionSource<bool> deleteRequestComplete = null;
...
public SoapService()
{
...
todoService.DeleteTodoItemCompleted += TodoService_DeleteTodoItemCompleted;
}
public async Task DeleteTodoItemAsync (string id)
{
try
{
deleteRequestComplete = new TaskCompletionSource<bool>();
todoService.DeleteTodoItemAsync(id);
await deleteRequestComplete.Task;
}
catch (SoapException se)
{
Debug.WriteLine("\t\t{0}", se.Message);
}
catch (Exception ex)
{
Debug.WriteLine("\t\tERROR {0}", ex.Message);
}
}
private void TodoService_DeleteTodoItemCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
deleteRequestComplete?.TrySetResult(true);
}
...
}
Menguji aplikasi web
Menguji perangkat fisik atau yang ditiru dengan layanan yang dihosting secara lokal memerlukan Konfigurasi IIS kustom, alamat titik akhir, dan aturan firewall untuk diterapkan. Untuk detail selengkapnya tentang cara menyiapkan lingkungan Anda untuk pengujian, lihat Mengonfigurasi akses jarak jauh ke IIS Express. Satu-satunya perbedaan antara pengujian WCF dan ASMX adalah nomor port TodoService.