Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Aplikasi klien harus membuat, mengonfigurasi, dan menggunakan objek klien atau saluran WCF untuk berkomunikasi dengan layanan. Topik Gambaran Umum Klien WCF memberikan gambaran umum tentang objek dan langkah-langkah yang terlibat dalam membuat objek klien dan saluran dasar dan menggunakannya.
Topik ini memberikan informasi mendalam tentang beberapa masalah dengan aplikasi klien dan objek klien dan saluran yang mungkin berguna tergantung pada skenario Anda.
Gambaran Umum
Topik ini menjelaskan perilaku dan masalah yang berkaitan dengan:
Masa pakai saluran dan sesi.
Menangani pengecualian.
Memahami masalah pemblokiran.
Menginisialisasi saluran secara interaktif.
Umur Masa Saluran dan Sesi
Aplikasi Windows Communication Foundation (WCF) mencakup dua kategori saluran, datagram, dan berbasis sesi.
Saluran datagram adalah saluran di mana semua pesan tidak terkait. Dengan saluran datagram, jika operasi input atau output gagal, operasi berikutnya biasanya tidak terpengaruh, dan saluran yang sama dapat digunakan kembali. Karena itu, saluran datagram biasanya tidak mengalami kegagalan.
Namun, saluran Sessionful adalah saluran yang memiliki koneksi ke titik akhir lainnya. Pesan dalam sesi di satu sisi selalu berkorelasi dengan sesi yang sama di sisi lain. Selain itu, kedua peserta dalam sesi harus setuju bahwa persyaratan percakapan mereka terpenuhi agar sesi tersebut dianggap berhasil. Jika mereka tidak dapat menyepakati, saluran sesi mungkin mengalami kerusakan.
Buka klien secara eksplisit atau implisit dengan memanggil operasi pertama.
Nota
Mencoba mendeteksi saluran penuh sesi yang bermasalah secara eksplisit biasanya tidak berguna, karena waktu Anda menerima pemberitahuan tergantung pada bagaimana sesi diimplementasikan. Misalnya, karena System.ServiceModel.NetTcpBinding (dengan sesi yang dapat dipercaya dinonaktifkan) mengungkapkan sesi koneksi TCP, jika Anda memonitor peristiwa ICommunicationObject.Faulted pada layanan atau klien, Anda mungkin akan diberi tahu dengan cepat jika terjadi kegagalan jaringan. Namun, sesi yang dapat diandalkan (yang ditetapkan oleh pengikatan di mana System.ServiceModel.Channels.ReliableSessionBindingElement diaktifkan) dirancang untuk mengisolasi layanan dari kegagalan jaringan kecil. Jika sesi dapat dibangun kembali dalam jangka waktu yang wajar, pengikatan yang sama—dikonfigurasi untuk sesi yang andal—tidak akan gagal sampai gangguan berlangsung lebih lama.
Sebagian besar pengikatan yang disediakan sistem (yang mengekspos saluran ke lapisan aplikasi) menggunakan sesi secara default, tetapi System.ServiceModel.BasicHttpBinding tidak. Untuk informasi selengkapnya, lihat Menggunakan Sesi.
Penggunaan Sesi yang Tepat
Sesi menyediakan cara untuk mengetahui apakah seluruh pertukaran pesan selesai, dan jika kedua belah pihak menganggapnya berhasil. Disarankan agar aplikasi panggilan membuka saluran, menggunakannya, dan menutup saluran di dalam satu blok 'try'. Jika saluran sesi terbuka, dan metode dipanggil ICommunicationObject.Close sekali, dan panggilan tersebut berhasil dikembalikan, maka sesi berhasil. Berhasil dalam hal ini berarti semua jaminan pengiriman yang ditentukan terpenuhi, dan sisi lain tidak memanggil ICommunicationObject.Abort pada saluran sebelum memanggil Close.
Bagian berikut ini menyediakan contoh pendekatan klien ini.
Menangani Pengecualian
Menangani pengecualian dalam aplikasi klien sangat mudah. Jika saluran dibuka, digunakan, dan ditutup di dalam blok coba, maka percakapan berhasil, kecuali pengecualian terjadi. Biasanya, jika pengecualian terjadi, percakapan dihentikan.
Nota
Penggunaan using pernyataan (Using di Visual Basic) tidak disarankan. Ini karena akhir using pernyataan dapat menyebabkan pengecualian yang dapat menutupi pengecualian lain yang mungkin perlu Anda ketahui. Untuk informasi selengkapnya, lihat Gunakan Tutup dan Batalkan untuk melepaskan sumber daya klien WCF.
Contoh kode berikut menunjukkan pola klien yang disarankan menggunakan blok try/catch dan bukan pernyataan using.
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.WCF.Documentation;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException<GreetingFault> greetingFault)
{
Console.WriteLine(greetingFault.Detail.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (FaultException unknownFault)
{
Console.WriteLine("An unknown exception was received. " + unknownFault.Message);
Console.ReadLine();
wcfClient.Abort();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message + commProblem.StackTrace);
Console.ReadLine();
wcfClient.Abort();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Imports Microsoft.WCF.Documentation
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting As String = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
Console.ReadLine()
wcfClient.Abort()
Catch greetingFault As FaultException(Of GreetingFault)
Console.WriteLine(greetingFault.Detail.Message)
Console.ReadLine()
wcfClient.Abort()
Catch unknownFault As FaultException
Console.WriteLine("An unknown exception was received. " & unknownFault.Message)
Console.ReadLine()
wcfClient.Abort()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message + commProblem.StackTrace)
Console.ReadLine()
wcfClient.Abort()
End Try
End Sub
End Class
Nota
Memeriksa nilai ICommunicationObject.State properti adalah kondisi balapan dan tidak disarankan untuk menentukan apakah akan menggunakan kembali atau menutup saluran.
Saluran Datagram tidak pernah mengalami kesalahan bahkan jika pengecualian terjadi saat ditutup. Selain itu, klien yang bukan dupleks yang gagal melakukan autentikasi menggunakan percakapan aman biasanya menghasilkan kesalahan System.ServiceModel.Security.MessageSecurityException. Namun, jika klien dupleks yang menggunakan percakapan aman gagal mengautentikasi, klien menerima System.TimeoutException sebagai gantinya.
Untuk informasi selengkapnya tentang bekerja dengan informasi kesalahan di tingkat aplikasi, lihat Menentukan dan Menangani Kesalahan dalam Kontrak dan Layanan. Pengecualian yang Diharapkan menjelaskan pengecualian yang diharapkan dan menunjukkan cara menanganinya. Untuk informasi selengkapnya tentang cara menangani kesalahan saat mengembangkan saluran, lihat Menangani Pengecualian dan Kesalahan.
Pemblokiran Klien dan Kinerja
Ketika aplikasi secara sinkron memanggil operasi balasan permintaan, klien memblokir hingga nilai pengembalian diterima atau pengecualian (seperti System.TimeoutException) dilemparkan. Perilaku ini mirip dengan perilaku lokal. Ketika aplikasi secara sinkron memanggil operasi pada objek atau saluran klien WCF, klien tidak kembali sampai lapisan saluran dapat menulis data ke jaringan atau sampai pengecualian dilemparkan. Dan sementara pola pertukaran pesan satu arah (ditentukan dengan menandai operasi dengan OperationContractAttribute.IsOneWay diatur ke true) dapat membuat beberapa klien lebih responsif, operasi satu arah juga dapat memblokir, tergantung pada pengikatan dan pesan apa yang telah dikirim. Operasi satu arah hanya tentang pertukaran pesan, tidak lebih dan tidak kurang. Untuk informasi selengkapnya, lihat LayananOne-Way.
Potongan data besar dapat memperlambat pemrosesan klien terlepas dari pola pertukaran pesan. Untuk memahami cara menangani masalah ini, lihat Data Besar dan Streaming.
Jika aplikasi Anda harus melakukan lebih banyak pekerjaan saat operasi selesai, Anda harus membuat pasangan metode asinkron pada antarmuka kontrak layanan yang diterapkan klien WCF Anda. Cara paling mudah untuk melakukan ini adalah dengan menggunakan /async switch pada ServiceModel Metadata Utility Tool (Svcutil.exe). Misalnya, lihat Cara: Memanggil Operasi Layanan Secara Asinkron.
Untuk informasi selengkapnya tentang meningkatkan performa klien, lihat Middle-Tier Aplikasi Klien.
Mengaktifkan Pengguna untuk Memilih Kredensial Secara Dinamis
Antarmuka IInteractiveChannelInitializer memungkinkan aplikasi untuk menampilkan antarmuka pengguna yang memungkinkan pengguna memilih kredensial yang digunakan untuk membuat saluran sebelum pengatur waktu kedaluwarsa dimulai.
Pengembang aplikasi dapat menggunakan sisipan IInteractiveChannelInitializer dengan dua cara. Aplikasi klien dapat memanggil atau ClientBase<TChannel>.DisplayInitializationUIIClientChannel.DisplayInitializationUI (atau versi asinkron) sebelum membuka saluran (pendekatan eksplisit ) atau memanggil operasi pertama (pendekatan implisit ).
Jika menggunakan pendekatan implisit, aplikasi harus memanggil operasi pertama pada ClientBase<TChannel> ekstensi atau IClientChannel . Jika memanggil apa pun selain operasi pertama, pengecualian akan dilemparkan.
Jika menggunakan pendekatan eksplisit, aplikasi harus melakukan langkah-langkah berikut secara berurutan:
Panggil salah satu dari ClientBase<TChannel>.DisplayInitializationUI atau IClientChannel.DisplayInitializationUI (atau versi asinkron).
Saat penginisialisasi selesai, panggil metode Open pada objek IClientChannel atau pada objek yang dikembalikan dari properti IClientChannel melalui ClientBase<TChannel>.InnerChannel.
Pengoperasian panggilan.
Disarankan agar aplikasi berkualitas produksi mengontrol proses antarmuka pengguna dengan mengadopsi pendekatan eksplisit.
Aplikasi yang menggunakan pendekatan implisit memanggil penginisialisasi antarmuka pengguna, tetapi jika pengguna aplikasi gagal merespons dalam batas waktu pengiriman yang ditetapkan oleh pengikatan, kesalahan akan terjadi saat antarmuka pengguna kembali.