Gambaran Umum Pembuatan Titik Akhir

Semua komunikasi dengan layanan Windows Communication Foundation (WCF) terjadi melalui titik akhir layanan. Titik akhir menyediakan akses klien ke fungsionalitas yang ditawarkan layanan WCF. Bagian ini menjelaskan struktur titik akhir dan menguraikan cara menentukan titik akhir dalam konfigurasi dan dalam kode.

Struktur Titik Akhir

Setiap titik akhir berisi alamat yang menunjukkan tempat menemukan titik akhir, pengikatan yang menentukan bagaimana klien dapat berkomunikasi dengan titik akhir, dan kontrak yang mengidentifikasi metode yang tersedia.

  • Alamat. Alamat secara unik mengidentifikasi titik akhir dan memberi tahu calon konsumen tempat layanan berada. Ini diwakili dalam model objek WCF oleh EndpointAddress alamat, yang berisi Pengidentifikasi Sumber Daya Seragam (URI) dan properti alamat yang mencakup identitas, beberapa elemen Web Services Description Language (WSDL), dan kumpulan header opsional. Header opsional menyediakan informasi alamat terperinci tambahan untuk mengidentifikasi atau berinteraksi dengan titik akhir. Untuk informasi selengkapnya, lihat Menentukan Alamat Titik Akhir.

  • Pengikatan. Pengikatan menentukan cara berkomunikasi dengan titik akhir. Pengikatan menentukan bagaimana titik akhir berkomunikasi dengan dunia, termasuk protokol transportasi mana yang akan digunakan (misalnya, TCP atau HTTP), pengkodean yang digunakan untuk pesan (misalnya, teks atau biner), dan persyaratan keamanan yang diperlukan (misalnya, Secure Sockets Layer [SSL] atau keamanan pesan SOAP). Untuk informasi selengkapnya, lihat Menggunakan Pengikatan untuk Mengonfigurasi Layanan dan Klien.

  • Kontrak layanan. Kontrak layanan menjelaskan fungsi yang diekspos oleh titik akhir kepada klien. Kontrak menentukan operasi yang dapat dipanggil klien, bentuk pesan dan jenis parameter input atau data yang diperlukan untuk memanggil operasi, dan jenis pesan pemrosesan atau respons yang dapat diharapkan klien. Tiga jenis kontrak dasar sesuai dengan pola pertukaran pesan dasar (MEPs): datagram (satu arah), permintaan/balasan, dan dupleks (dua arah). Kontrak layanan juga dapat menggunakan kontrak data dan pesan untuk memerlukan jenis data dan format pesan tertentu saat diakses. Untuk informasi selengkapnya tentang cara menentukan kontrak layanan, lihat Merancang Kontrak Layanan. Perhatikan bahwa klien mungkin juga harus menerapkan kontrak yang ditetapkan oleh layanan, yang disebut kontrak panggilan balik, untuk menerima pesan dari layanan dalam pola pertukaran pesan dupleks (MEP). Untuk informasi selengkapnya, lihat Layanan Duplex.

Titik akhir untuk layanan dapat ditentukan baik secara imperatif dengan menggunakan kode atau secara deklaratif melalui konfigurasi. Jika tidak ada titik akhir yang ditentukan maka runtime menyediakan titik akhir default dengan menambahkan satu titik akhir default untuk setiap alamat dasar untuk setiap kontrak layanan yang diterapkan oleh layanan. Menentukan titik akhir dalam kode biasanya tidak praktis karena pengikatan dan alamat untuk layanan yang disebarkan biasanya berbeda dari yang digunakan saat layanan sedang dikembangkan. Umumnya, lebih praktis untuk menentukan titik akhir layanan menggunakan konfigurasi daripada kode. Menjaga informasi pengikatan dan alamat keluar dari kode memungkinkan mereka untuk berubah tanpa harus mengkompilasi ulang dan menyebarkan ulang aplikasi.

Nota

Saat menambahkan titik akhir layanan yang melakukan peniruan, Anda harus menggunakan salah satu dari metode AddServiceEndpoint atau metode GetContract(Type, Type) untuk memuat kontrak dengan benar ke dalam objek baru ServiceDescription.

Menentukan Titik Akhir dalam Kode

Contoh berikut mengilustrasikan cara menentukan titik akhir dalam kode dengan yang berikut ini:

  • Menentukan kontrak untuk jenis layanan IEcho yang menerima nama seseorang dan memberikan respons "Halo <nama>!".

  • Terapkan layanan Echo dari jenis yang ditentukan berdasarkan kontrak IEcho.

  • Tentukan alamat http://localhost:8000/Echo titik akhir untuk layanan.

  • Konfigurasikan layanan Echo menggunakan penyambungan WSHttpBinding.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Use a predefined WSHttpBinding to configure the service.
          WSHttpBinding binding = new WSHttpBinding();

          // Add the endpoint for this service to the service host.
          serviceHost.AddServiceEndpoint(
             typeof(IEcho),
             binding,
             echoUri
           );

          // Open the service host to run it.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Create a ServiceHost for the Echo service.
Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri)

' Use a predefined WSHttpBinding to configure the service.
Dim binding As New WSHttpBinding()

' Add the endpoint for this service to the service host.
serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri)

' Open the service host to run it.
serviceHost.Open()

Nota

Host layanan dibuat dengan alamat dasar dan kemudian alamat lainnya, relatif terhadap alamat dasar, ditentukan sebagai bagian dari titik akhir. Pengelompokan alamat ini memungkinkan banyak titik akhir didefinisikan dengan lebih nyaman untuk layanan di host.

Nota

Properti ServiceDescription dalam aplikasi layanan tidak boleh dimodifikasi setelah metode OnOpening di ServiceHostBase. Beberapa anggota, seperti properti Credentials dan metode AddServiceEndpoint pada ServiceHostBase dan ServiceHost, menghasilkan pengecualian jika dimodifikasi melewati titik tersebut. Yang lain mengizinkan Anda untuk memodifikasinya, tetapi hasilnya tidak ditentukan.

Demikian pula, nilai ServiceEndpoint pada klien tidak boleh dimodifikasi setelah panggilan ke OnOpening dilakukan pada ChannelFactory. Properti Credentials melemparkan pengecualian jika dimodifikasi melewati titik tersebut. Nilai deskripsi klien lainnya dapat dimodifikasi tanpa kesalahan, tetapi hasilnya tidak ditentukan.

Baik untuk layanan atau klien, disarankan agar Anda mengubah deskripsi sebelum memanggil Open.

Menentukan Titik Akhir dalam Konfigurasi

Saat membuat aplikasi, Anda sering ingin menugaskan keputusan kepada administrator yang menyebarkan aplikasi. Misalnya, seringkali tidak ada cara untuk mengetahui terlebih dahulu seperti apa alamat layanan (URI). Alih-alih mengodekan alamat secara permanen, lebih baik mengizinkan administrator untuk melakukannya setelah membuat layanan. Fleksibilitas ini dicapai melalui konfigurasi. Untuk detailnya, lihat Mengonfigurasi Layanan.

Nota

Gunakan Alat Utilitas Metadata ServiceModel (Svcutil.exe) dengan sakelar /config:[, untuk membuat file konfigurasi dengan cepat.

Menggunakan Titik Akhir Default

Jika tidak ada titik akhir yang ditentukan dalam kode atau dalam konfigurasi, maka runtime menyediakan titik akhir default dengan menambahkan satu titik akhir default untuk setiap alamat dasar untuk setiap kontrak layanan yang diterapkan oleh layanan. Alamat dasar dapat ditentukan dalam kode atau dalam konfigurasi, dan titik akhir default ditambahkan ketika Open() dipanggil pada ServiceHost. Contoh ini adalah contoh yang sama dari bagian sebelumnya, tetapi karena tidak ada titik akhir yang ditentukan, titik akhir default ditambahkan.

namespace Echo
{
   // Define the contract for the IEcho service
   [ServiceContract]
   public interface IEcho
   {
       [OperationContract]
       String Hello(string name)
   }

   // Create an Echo service that implements IEcho contract
   public class Echo : IEcho
   {
      public string Hello(string name)
      {
         return "Hello" + name + "!";
      }
      public static void Main ()
      {
          //Specify the base address for Echo service.
          Uri echoUri = new Uri("http://localhost:8000/");

          //Create a ServiceHost for the Echo service.
          ServiceHost serviceHost = new ServiceHost(typeof(Echo),echoUri);

          // Open the service host to run it. Default endpoints
          // are added when the service is opened.
          serviceHost.Open();
     }
  }
}
' Define the contract for the IEcho service
    <ServiceContract()> _
    Public Interface IEcho
        <OperationContract()> _
        Function Hello(ByVal name As String) As String
    End Interface

' Create an Echo service that implements IEcho contract
    Public Class Echo
        Implements IEcho
        Public Function Hello(ByVal name As String) As String _
 Implements ICalculator.Hello
            Dim result As String = "Hello" + name + "!"
            Return result
        End Function

' Specify the base address for Echo service.
Dim echoUri As Uri = New Uri("http://localhost:8000/")

' Open the service host to run it. Default endpoints
' are added when the service is opened.
serviceHost.Open()

Jika titik akhir disediakan secara eksplisit, titik akhir default masih dapat ditambahkan dengan memanggil AddDefaultEndpointsServiceHost sebelum memanggil Open. Untuk informasi selengkapnya tentang titik akhir default, lihat Konfigurasi Yang Disederhanakan dan Konfigurasi Yang Disederhanakan untuk Layanan WCF.

Lihat juga