Bagikan melalui


Mengakses Layanan Menggunakan Klien

Aplikasi klien harus membuat, mengonfigurasi, dan menggunakan objek klien atau saluran WCF untuk berkomunikasi dengan layanan. Topik Ikhtisar Klien WCF memberikan ikhtisar 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.

Masa Pakai Saluran dan Sesi

Aplikasi Windows Communication Foundation (WCF) mencakup dua kategori saluran, datagram, dan 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 salah.

Akan tetapi, saluran Sessionful adalah saluran dengan 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 peserta tidak dapat setuju, saluran sesi mungkin salah.

Buka klien secara eksplisit atau implisit dengan memanggil operasi pertama.

Catatan

Mencoba mendeteksi saluran sesi yang rusak secara eksplisit biasanya tidak berguna, karena ketika Anda diberi tahu tergantung pada implementasi sesi. Misalnya, karena System.ServiceModel.NetTcpBinding (dengan sesi yang andal dinonaktifkan) memunculkan sesi koneksi TCP, jika Anda mendengarkan peristiwa ICommunicationObject.Faulted pada layanan atau klien, Anda kemungkinan akan diberi tahu dengan cepat jika terjadi kesalahan jaringan. Tetapi sesi yang andal (dibuat olehpengikatan di mana System.ServiceModel.Channels.ReliableSessionBindingElement diaktifkan) dirancang untuk melindungi layanan dari kegagalan jaringan kecil. Jika sesi dapat dibuat ulang dalam jangka waktu yang wajar, pengikatan yang sama—dikonfigurasi untuk sesi yang andal—mungkin tidak salah sampai interupsi berlanjut untuk jangka waktu yang 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. Sebaiknya aplikasi panggilan membuka saluran, menggunakannya, dan menutup saluran di dalam satu blok coba. Jika saluran sesi terbuka, dan metode dipanggil ICommunicationObject.Close sekali, dan panggilan tersebut berhasil dikembalikan, maka sesi berhasil. Berhasil dalam hal ini berarti bahwa semua pengiriman menjamin pengikatan yang ditentukan terpenuhi, dan sisi lain tidak memanggil saluran ICommunicationObject.Abort sebelum memanggil Close.

Bagian berikut memberikan contoh pendekatan klien ini.

Menangani Pengecualian

Menangani pengecualian dalam aplikasi klien sangatlah mudah. Jika saluran dibuka, digunakan, dan ditutup di dalam blok percobaan, maka percakapan telah berhasil, kecuali pengecualian dimunculkan. Biasanya, jika pengecualian dimunculkan percakapan dibatalkan.

Catatan

Penggunaan pernyataan using (Using dalam Visual Basic) tidak disarankan. Ini karena akhir pernyataan using dapat menyebabkan pengecualian yang dapat menutupi pengecualian lain yang mungkin perlu Anda ketahui. Untuk informasi selengkapnya, lihat Menggunakan Tutup dan Batalkan untuk melepaskan sumber daya klien WCF.

Contoh kode berikut menunjukkan pola klien yang direkomendasikan menggunakan blok coba/tangkap 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

Catatan

Memeriksa nilai properti ICommunicationObject.State adalah kondisi bersaing dan tidak disarankan untuk menentukan apakah akan menggunakan kembali atau menutup saluran.

Saluran datagram tidak pernah rusak meskipun pengecualian terjadi saat ditutup. Selain itu, klien non-dupleks yang gagal mengautentikasi menggunakan percakapan aman biasanya memunculkan System.ServiceModel.Security.MessageSecurityException. Namun jika klien dupleks yang menggunakan percakapan aman gagal untuk mengautentikasi, klien menerima System.TimeoutException sebagai gantinya.

Untuk informasi lebih lengkap 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 dan Performa Klien

Ketika aplikasi secara sinkron memanggil operasi balasan permintaan, klien memblokir hingga nilai pengembalian diterima atau pengecualian (seperti System.TimeoutException) dimunculkan. 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 dimunculkan. Dan sementara pola pertukaran pesan satu arah (ditentukan dengan menandai operasi dengan OperationContractAttribute.IsOneWay disetel ke true) dapat membuat beberapa klien lebih responsif, operasi satu arah juga dapat memblokir, tergantung pada pengikatan dan pesan apa yang telah terkirim. Operasi satu arah hanya tentang pertukaran pesan, tidak lebih dan tidak kurang. Untuk informasi selengkapnya, lihat Layanan Satu Arah.

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 diimplementasikan klien WCF Anda. Cara termudah untuk melakukannya adalah dengan menggunakan sakelar /async pada Alat Utilitas Metadata ServiceModel (Svcutil.exe). Misalnya, lihat Cara: Memanggil Operasi Layanan Secara Asinkron.

Untuk informasi selengkapnya tentang meningkatkan performa klien, lihat Aplikasi Klien Tingkat Menengah.

Mengaktifkan Pengguna untuk Memilih Kredensial Secara Dinamis

Antarmuka IInteractiveChannelInitializer memungkinkan aplikasi untuk menampilkan antarmuka pengguna yang memungkinkan pengguna memilih kredensial tempat saluran dibuat sebelum timer waktu habis 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 ekstensi ClientBase<TChannel> atau IClientChannel. Jika itu memanggil apa pun selain operasi pertama, pengecualian dimunculkan.

Jika menggunakan pendekatan eksplisit, aplikasi harus melakukan langkah-langkah berikut secara berurutan:

  1. Panggil ClientBase<TChannel>.DisplayInitializationUI atau IClientChannel.DisplayInitializationUI (atau versi asinkron).

  2. Ketika penginisialisasi telah kembali, panggil metode Open pada objek IClientChannel atau pada objek IClientChannel yang dikembalikan dari properti ClientBase<TChannel>.InnerChannel.

  3. Operasi panggilan.

Disarankan agar aplikasi berkualitas produksi mengontrol proses antarmuka pengguna dengan mengadopsi pendekatan eksplisit.

Aplikasi yang menggunakan pendekatan implisit memanggil inisialisasi antarmuka pengguna, tetapi jika pengguna aplikasi gagal merespons dalam periode batas waktu pengiriman pengikatan, pengecualian dimunculkan saat antarmuka pengguna kembali.

Lihat juga