Bagikan melalui


Menggunakan Layanan Web Windows Communication Foundation (WCF)

WCF adalah kerangka kerja terpadu Microsoft untuk membangun aplikasi berorientasi layanan. Ini memungkinkan pengembang untuk membangun aplikasi terdistribusi yang aman, andal, ditransaksikan, dan dapat dioperasikan. Artikel ini menunjukkan cara menggunakan layanan Protokol Akses Objek Sederhana (SOAP) WCF dari aplikasi Xamarin.Forms .

WCF menjelaskan layanan dengan berbagai kontrak yang berbeda termasuk:

  • Kontrak data – menentukan struktur data yang membentuk dasar untuk konten dalam pesan.
  • Kontrak pesan – buat pesan dari kontrak data yang ada.
  • Kontrak kesalahan – memungkinkan kesalahan SOAP kustom ditentukan.
  • Kontrak layanan – tentukan operasi yang didukung layanan dan pesan yang diperlukan untuk berinteraksi dengan setiap operasi. Mereka juga menentukan perilaku kesalahan kustom yang dapat dikaitkan dengan operasi pada setiap layanan.

Ada perbedaan antara ASP.NET Web Services (ASMX) dan WCF, tetapi WCF mendukung kemampuan yang sama dengan yang disediakan ASMX - pesan SOAP melalui HTTP. Untuk informasi selengkapnya tentang menggunakan layanan ASMX, lihat Menggunakan ASP.NET Web Services (ASMX).

Penting

Dukungan platform Xamarin untuk WCF terbatas pada pesan SOAP yang dikodekan teks melalui HTTP/HTTPS menggunakan BasicHttpBinding kelas .

Dukungan WCF memerlukan penggunaan alat yang hanya tersedia di lingkungan Windows untuk menghasilkan proksi dan menghosting TodoWCFService. Membangun dan menguji aplikasi iOS akan memerlukan penyebaran TodoWCFService di komputer Windows, atau sebagai layanan web Azure.

Aplikasi asli Xamarin Forms biasanya berbagi kode dengan Pustaka Kelas Standar .NET. Namun, .NET Core saat ini tidak mendukung WCF sehingga proyek bersama harus menjadi Pustaka Kelas Portabel warisan. Untuk informasi tentang dukungan WCF di .NET Core, lihat Memilih antara .NET Core dan .NET Framework untuk aplikasi server.

Solusi aplikasi sampel mencakup layanan WCF yang dapat dijalankan secara lokal, dan ditampilkan dalam 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 WCF 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.

Proksi harus dihasilkan untuk menggunakan layanan WCF, yang memungkinkan aplikasi untuk terhubung ke layanan. Proksi dibangun dengan menggunakan metadata layanan yang menentukan metode dan konfigurasi layanan terkait. Metadata ini diekspos dalam bentuk dokumen Web Services Description Language (WSDL) yang dihasilkan oleh layanan web. Proksi dapat dibangun dengan menggunakan Penyedia Referensi Layanan Web Microsoft WCF di Visual Studio 2017 untuk menambahkan referensi layanan untuk layanan web ke pustaka .NET Standard. Alternatif untuk membuat proksi menggunakan Penyedia Referensi Layanan Web Microsoft WCF di Visual Studio 2017 adalah dengan menggunakan ServiceModel Metadata Utility Tool (svcutil.exe). Untuk informasi selengkapnya, lihat Alat Utilitas Metadata ServiceModel (Svcutil.exe).

Kelas proksi yang dihasilkan menyediakan metode untuk menggunakan layanan web yang menggunakan pola desain Model Pemrograman Asinkron (APM). Dalam pola ini, operasi asinkron diimplementasikan sebagai dua metode bernama BeginOperationName dan EndOperationName, yang memulai dan mengakhiri operasi asinkron.

Metode BeginOperationName memulai operasi asinkron dan mengembalikan objek yang mengimplementasikan IAsyncResult antarmuka. Setelah memanggil BeginOperationName, aplikasi dapat terus menjalankan instruksi pada utas panggilan, sementara operasi asinkron terjadi pada utas kumpulan utas.

Untuk setiap panggilan ke BeginOperationName, aplikasi juga harus memanggil EndOperationName untuk mendapatkan hasil operasi. Nilai pengembalian EndOperationName adalah jenis yang sama yang dikembalikan oleh metode layanan web sinkron. Misalnya, EndGetTodoItems metode mengembalikan kumpulan TodoItem instans. Metode EndOperationName juga menyertakan IAsyncResult parameter yang harus diatur ke instans yang dikembalikan oleh panggilan yang sesuai ke metode BeginOperationName .

Pustaka Paralel Tugas (TPL) dapat menyederhanakan proses penggunaan pasangan metode mulai/akhir APM dengan merangkum operasi asinkron dalam objek yang sama Task . Enkapsulasi ini disediakan oleh beberapa kelebihan beban TaskFactory.FromAsync metode.

Untuk informasi selengkapnya tentang APM lihat Model Pemrograman Asinkron dan TPL dan Pemrograman Asinkron .NET Framework Tradisional di MSDN.

Membuat objek TodoServiceClient

Kelas proksi yang dihasilkan menyediakan TodoServiceClient kelas , yang digunakan untuk berkomunikasi dengan layanan WCF melalui HTTP. Ini menyediakan fungsionalitas untuk memanggil metode layanan web sebagai operasi asinkron dari instans layanan yang diidentifikasi URI. Untuk informasi selengkapnya tentang operasi asinkron, lihat Gambaran Umum Dukungan Asinkron.

TodoServiceClient Instans dinyatakan pada tingkat kelas sehingga objek hidup selama aplikasi perlu menggunakan layanan WCF, seperti yang ditunjukkan dalam contoh kode berikut:

public class SoapService : ISoapService
{
  ITodoService todoService;
  ...

  public SoapService ()
  {
    todoService = new TodoServiceClient (
      new BasicHttpBinding (),
      new EndpointAddress (Constants.SoapUrl));
  }
  ...
}

TodoServiceClient Instans dikonfigurasi dengan informasi pengikatan dan alamat titik akhir. Pengikatan digunakan untuk menentukan detail transportasi, pengodean, dan protokol yang diperlukan agar aplikasi dan layanan dapat berkomunikasi satu sama lain. BasicHttpBinding menentukan bahwa pesan SOAP yang dikodekan teks akan dikirim melalui protokol transportasi HTTP. Menentukan alamat titik akhir memungkinkan aplikasi terhubung ke instans layanan WCF yang berbeda, asalkan ada beberapa instans yang diterbitkan.

Untuk informasi selengkapnya tentang mengonfigurasi referensi layanan, lihat Mengonfigurasi Referensi Layanan.

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 ToWCFServiceTodoItem ditunjukkan dalam contoh kode berikut:

TodoWCFService.TodoItem ToWCFServiceTodoItem (TodoItem item)
{
  return new TodoWCFService.TodoItem
  {
    ID = item.ID,
    Name = item.Name,
    Notes = item.Notes,
    Done = item.Done
  };
}

Metode ini hanya membuat instans baru TodoWCFService.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 FromWCFServiceTodoItem ditunjukkan dalam contoh kode berikut:

static TodoItem FromWCFServiceTodoItem (TodoWCFService.TodoItem item)
{
  return new TodoItem
  {
    ID = item.ID,
    Name = item.Name,
    Notes = item.Notes,
    Done = item.Done
  };
}

Metode ini hanya mengambil data dari jenis proksi yang dihasilkan TodoItem dan mengaturnya dalam instans yang baru dibuat TodoItem .

Mengambil data

Metode TodoServiceClient.BeginGetTodoItems dan TodoServiceClient.EndGetTodoItems digunakan untuk memanggil operasi yang GetTodoItems disediakan oleh layanan web. Metode asinkron ini dienkapsulasi dalam objek, seperti yang Task ditunjukkan dalam contoh kode berikut:

public async Task<List<TodoItem>> RefreshDataAsync ()
{
  ...
  var todoItems = await Task.Factory.FromAsync <ObservableCollection<TodoWCFService.TodoItem>> (
    todoService.BeginGetTodoItems,
    todoService.EndGetTodoItems,
    null,
    TaskCreationOptions.None);

  foreach (var item in todoItems)
  {
    Items.Add (FromWCFServiceTodoItem (item));
  }
  ...
}

Metode ini Task.Factory.FromAsync membuat Task metode yang dijalankan TodoServiceClient.EndGetTodoItems setelah TodoServiceClient.BeginGetTodoItems metode selesai, dengan null parameter yang menunjukkan bahwa tidak ada data yang diteruskan ke BeginGetTodoItems delegasi. Terakhir, nilai TaskCreationOptions enumerasi menentukan bahwa perilaku default untuk pembuatan dan eksekusi tugas harus digunakan.

Metode mengembalikan TodoServiceClient.EndGetTodoItems instans ObservableCollectionTodoWCFService.TodoItem , yang kemudian dikonversi ke List instans TodoItem untuk ditampilkan.

Buat data

Metode TodoServiceClient.BeginCreateTodoItem dan TodoServiceClient.EndCreateTodoItem digunakan untuk memanggil operasi yang CreateTodoItem disediakan oleh layanan web. Metode asinkron ini dienkapsulasi dalam objek, seperti yang Task ditunjukkan dalam contoh kode berikut:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  ...
  var todoItem = ToWCFServiceTodoItem (item);
  ...
  await Task.Factory.FromAsync (
    todoService.BeginCreateTodoItem,
    todoService.EndCreateTodoItem,
    todoItem,
    TaskCreationOptions.None);
  ...
}

Metode ini Task.Factory.FromAsync membuat Task metode yang dijalankan TodoServiceClient.EndCreateTodoItem setelah TodoServiceClient.BeginCreateTodoItem metode selesai, dengan todoItem parameter menjadi data yang diteruskan ke BeginCreateTodoItem delegasi untuk menentukan TodoItem yang akan dibuat oleh layanan web. Terakhir, nilai TaskCreationOptions enumerasi menentukan bahwa perilaku default untuk pembuatan dan eksekusi tugas harus digunakan.

Layanan web melempar FaultException jika gagal membuat , yang ditangani TodoItemoleh aplikasi.

Memperbarui data

Metode TodoServiceClient.BeginEditTodoItem dan TodoServiceClient.EndEditTodoItem digunakan untuk memanggil operasi yang EditTodoItem disediakan oleh layanan web. Metode asinkron ini dienkapsulasi dalam objek, seperti yang Task ditunjukkan dalam contoh kode berikut:

public async Task SaveTodoItemAsync (TodoItem item, bool isNewItem = false)
{
  ...
  var todoItem = ToWCFServiceTodoItem (item);
  ...
  await Task.Factory.FromAsync (
    todoService.BeginEditTodoItem,
    todoService.EndEditTodoItem,
    todoItem,
    TaskCreationOptions.None);
  ...
}

Metode ini Task.Factory.FromAsync membuat yang menjalankan TodoServiceClient.EndEditTodoItem metode setelah TodoServiceClient.BeginCreateTodoItem metode selesai, dengan todoItem parameter menjadi data yang diteruskan ke BeginEditTodoItem delegasi untuk menentukan yang TodoItem akan diperbarui Task oleh layanan web. Terakhir, nilai TaskCreationOptions enumerasi menentukan bahwa perilaku default untuk pembuatan dan eksekusi tugas harus digunakan.

Layanan web melempar FaultException jika gagal menemukan atau memperbarui TodoItem, yang ditangani oleh aplikasi.

Menghapus data

Metode TodoServiceClient.BeginDeleteTodoItem dan TodoServiceClient.EndDeleteTodoItem digunakan untuk memanggil operasi yang DeleteTodoItem disediakan oleh layanan web. Metode asinkron ini dienkapsulasi dalam objek, seperti yang Task ditunjukkan dalam contoh kode berikut:

public async Task DeleteTodoItemAsync (string id)
{
  ...
  await Task.Factory.FromAsync (
    todoService.BeginDeleteTodoItem,
    todoService.EndDeleteTodoItem,
    id,
    TaskCreationOptions.None);
  ...
}

Metode ini Task.Factory.FromAsync membuat Task metode yang dijalankan TodoServiceClient.EndDeleteTodoItem setelah TodoServiceClient.BeginDeleteTodoItem metode selesai, dengan id parameter menjadi data yang diteruskan ke BeginDeleteTodoItem delegasi untuk menentukan TodoItem yang akan dihapus oleh layanan web. Terakhir, nilai TaskCreationOptions enumerasi menentukan bahwa perilaku default untuk pembuatan dan eksekusi tugas harus digunakan.

Layanan web melempar FaultException jika gagal menemukan atau menghapus TodoItem, yang ditangani oleh aplikasi.

Mengonfigurasi akses jarak jauh ke IIS Express

Di Visual Studio 2017 atau Visual Studio 2019, Anda harus dapat menguji aplikasi UWP pada PC tanpa konfigurasi tambahan. Menguji klien Android dan iOS mungkin memerlukan langkah tambahan di bagian ini. Lihat Koneksi ke Layanan Web Lokal dari Simulator iOS dan Emulator Android untuk informasi selengkapnya.

Secara default, IIS Express hanya akan menanggapi permintaan ke localhost. Perangkat jarak jauh (seperti perangkat Android, i Telepon atau bahkan simulator) tidak akan memiliki akses ke layanan WCF lokal Anda. Anda perlu mengetahui alamat IP stasiun kerja Windows 10 Anda di jaringan lokal. Untuk tujuan contoh ini, asumsikan bahwa stasiun kerja Anda memiliki alamat 192.168.1.143IP . Langkah-langkah berikut menjelaskan cara mengonfigurasi Windows 10 dan IIS Express untuk menerima koneksi jarak jauh dan terhubung ke layanan dari perangkat fisik atau virtual:

  1. Tambahkan pengecualian ke Windows Firewall. Anda harus membuka port melalui Windows Firewall yang dapat digunakan aplikasi pada subnet Anda untuk berkomunikasi dengan layanan WCF. Buat port pembuka aturan masuk 49393 di firewall. Dari prompt perintah administratif, jalankan perintah ini:

    netsh advfirewall firewall add rule name="TodoWCFService" dir=in protocol=tcp localport=49393 profile=private remoteip=localsubnet action=allow
    
  2. Konfigurasikan IIS Express untuk Menerima koneksi Jarak Jauh. Anda dapat mengonfigurasi IIS Express dengan mengedit file konfigurasi untuk IIS Express di [direktori solusi].vs\config\applicationhost.config. site Temukan elemen dengan nama TodoWCFService. Ini akan terlihat mirip dengan XML berikut:

    <site name="TodoWCFService" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:49393:localhost" />
        </bindings>
    </site>
    

    Anda harus menambahkan dua binding elemen untuk membuka port 49393 ke lalu lintas luar dan emulator Android. Pengikatan menggunakan [IP address]:[port]:[hostname] format yang menentukan bagaimana IIS Express akan merespons permintaan. Permintaan eksternal akan memiliki nama host yang harus ditentukan sebagai binding. Tambahkan XML berikut ke bindings elemen , ganti alamat IP dengan alamat IP Anda sendiri:

    <binding protocol="http" bindingInformation="*:49393:192.168.1.143" />
    <binding protocol="http" bindingInformation="*:49393:127.0.0.1" />
    

    Setelah perubahan bindings Anda, elemen akan terlihat seperti berikut ini:

    <site name="TodoWCFService" id="2">
        <application path="/" applicationPool="Clr4IntegratedAppPool">
            <virtualDirectory path="/" physicalPath="C:\Users\tom\TodoWCF\TodoWCFService\TodoWCFService" />
        </application>
        <bindings>
            <binding protocol="http" bindingInformation="*:49393:localhost" />
            <binding protocol="http" bindingInformation="*:49393:192.168.1.143" />
            <binding protocol="http" bindingInformation="*:49393:127.0.0.1" />
        </bindings>
    </site>
    

    Penting

    Secara default, IIS Express tidak akan menerima koneksi dari sumber eksternal karena alasan keamanan. Untuk mengaktifkan koneksi dari perangkat jarak jauh, Anda harus menjalankan IIS Express dengan izin Administratif. Cara term mudah untuk melakukan ini adalah dengan menjalankan Visual Studio 2017 dengan izin Administratif. Ini akan meluncurkan IIS Express dengan izin Administratif saat menjalankan TodoWCFService.

    Dengan langkah-langkah ini selesai, Anda harus dapat menjalankan TodoWCFService dan terhubung dari perangkat lain di subnet Anda. Anda dapat menguji ini dengan menjalankan aplikasi Anda dan mengunjungi http://localhost:49393/TodoService.svc. Jika Anda mendapatkan kesalahan Permintaan Buruk saat mengunjungi URL tersebut, Anda bindings mungkin salah dalam konfigurasi IIS Express (permintaan mencapai IIS Express tetapi sedang ditolak). Jika Anda mendapatkan kesalahan yang berbeda, mungkin aplikasi Anda tidak berjalan atau firewall Anda salah dikonfigurasi.

    Untuk mengizinkan IIS Express tetap menjalankan dan melayani layanan, nonaktifkan opsi Edit dan Lanjutkan di Project Properties > Web > Debuggers.

  3. Sesuaikan perangkat titik akhir yang digunakan untuk mengakses layanan. Langkah ini melibatkan konfigurasi aplikasi klien, yang berjalan pada perangkat fisik atau ditiru, untuk mengakses layanan WCF.

    Emulator Android menggunakan proksi internal yang mencegah emulator mengakses alamat komputer localhost host secara langsung. Sebagai gantinya, alamat 10.0.2.2 pada emulator dirutekan ke localhost pada komputer host melalui proksi internal. Permintaan yang diproksi ini akan memiliki 127.0.0.1 sebagai nama host di header permintaan, itulah sebabnya Anda membuat pengikatan IIS Express untuk nama host ini pada langkah-langkah di atas.

    Simulator iOS berjalan pada host build Mac, bahkan jika Anda menggunakan Simulator iOS Jarak Jauh untuk Windows. Permintaan jaringan dari simulator akan memiliki IP stasiun kerja Anda di jaringan lokal sebagai nama host (dalam contoh 192.168.1.143ini , tetapi alamat IP Anda yang sebenarnya kemungkinan akan berbeda). Inilah sebabnya mengapa Anda membuat pengikatan IIS Express untuk nama host ini pada langkah-langkah di atas.

    SoapUrl Pastikan properti dalam file Constants.cs di proyek TodoWCF (Portable) memiliki nilai yang benar untuk jaringan Anda:

    public static string SoapUrl
    {
        get
        {
            var defaultUrl = "http://localhost:49393/TodoService.svc";
    
            if (Device.RuntimePlatform == Device.Android)
            {
                defaultUrl = "http://10.0.2.2:49393/TodoService.svc";
            }
            else if (Device.RuntimePlatform == Device.iOS)
            {
                defaultUrl = "http://192.168.1.143:49393/TodoService.svc";
            }
    
            return defaultUrl;
        }
    }
    

    Setelah mengonfigurasi Constants.cs dengan titik akhir yang sesuai, Anda harus dapat terhubung ke TodoWCFService yang berjalan di stasiun kerja Windows 10 Anda dari perangkat fisik atau virtual.