Bagikan melalui


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:

Aplikasi Sampel

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:

  1. Membuat instans TodoService sebagai instans tingkat kelas
  2. Membuat koleksi yang dipanggil Items untuk menyimpan TodoItem objek
  3. Menentukan titik akhir kustom untuk properti opsional Url pada TodoService
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. TaskCompletionSourceTentukan , 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.