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:
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 ObservableCollection
TodoWCFService.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 TodoItem
oleh 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.143
IP . 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:
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
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 namaTodoWCFService
. 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 sebagaibinding
. Tambahkan XML berikut kebindings
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, Andabindings
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.
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, alamat10.0.2.2
pada emulator dirutekan kelocalhost
pada komputer host melalui proksi internal. Permintaan yang diproksi ini akan memiliki127.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.143
ini , 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.