Bagikan melalui


Gambaran Umum Penemuan WCF

API Penemuan menyediakan model pemrograman terpadu untuk publikasi dinamis dan penemuan layanan Web menggunakan protokol WS-Discovery. API ini memungkinkan layanan untuk menerbitkannya sendiri dan klien untuk menemukan layanan yang diterbitkan. Setelah layanan dibuat dapat ditemukan, layanan memiliki kemampuan untuk mengirim pesan pengumuman serta mendengarkan dan menanggapi permintaan penemuan. Layanan yang dapat ditemukan dapat mengirim pesan Hello untuk mengumumkan kedatangan mereka di jaringan dan pesan Bye untuk mengumumkan keberangkatannya dari jaringan. Untuk menemukan layanan, klien mengirim permintaan Probe yang berisi kriteria tertentu seperti jenis kontrak layanan, kata kunci, dan cakupan di jaringan. Layanan menerima permintaan Probe dan menentukan apakah mereka cocok dengan kriteria. Jika layanan cocok, layanan merespons dengan mengirim pesan ProbeMatch kembali ke klien dengan informasi yang diperlukan untuk menghubungi layanan. Klien juga dapat mengirim permintaan Resolve yang memungkinkan mereka menemukan layanan yang mungkin telah mengubah alamat titik akhir mereka. Layanan yang cocok merespons permintaan Resolve dengan mengirim pesan ResolveMatch kembali ke klien.

Mode Ad-Hoc dan Terkelola

API Penemuan mendukung dua mode berbeda: Terkelola dan Ad-Hoc. Dalam mode Terkelola ada server terpusat yang disebut proksi penemuan yang menyimpan informasi tentang layanan yang tersedia. Proksi penemuan dapat diisi dengan informasi tentang layanan dengan berbagai cara. Misalnya, layanan dapat mengirim pesan pengumuman selama memulai proksi penemuan atau proksi dapat membaca data dari database atau file konfigurasi untuk menentukan layanan apa yang tersedia. Bagaimana proksi penemuan diisi sepenuhnya hingga pengembang. Klien menggunakan proksi penemuan untuk mengambil informasi tentang layanan yang tersedia. Ketika klien mencari layanan, klien mengirim pesan Probe ke proksi penemuan dan proksi menentukan apakah salah satu layanan yang diketahuinya tentang kecocokan layanan yang dicari klien. Jika ada kecocokan, proksi penemuan akan mengirimkan respons ProbeMatch kembali ke klien. Klien kemudian dapat menghubungi layanan secara langsung menggunakan informasi layanan yang dikembalikan dari proksi. Prinsip utama di balik mode Terkelola adalah bahwa permintaan penemuan dikirim secara unicast ke satu otoritas, proksi penemuan. .NET Framework berisi komponen utama yang memungkinkan Anda membangun proksi Anda sendiri. Klien dan layanan dapat menemukan proksi dengan beberapa metode:

  • Proksi dapat merespons pesan ad-hoc.

  • Proksi dapat mengirim pesan pengumuman selama memulai.

  • Klien dan layanan dapat ditulis untuk mencari titik akhir terkenal tertentu.

Dalam mode Ad-Hoc, tidak ada server terpusat. Semua pesan penemuan seperti pengumuman layanan dan permintaan klien dikirim dengan cara multicast. Secara default, .NET Framework berisi dukungan untuk penemuan Ad-Hoc melalui protokol UDP. Misalnya, jika layanan dikonfigurasi untuk mengirimkan pengumuman Halo saat memulai, layanan mengirimkannya melalui alamat multicast yang terkenal menggunakan protokol UDP. Klien harus secara aktif mendengarkan pengumuman ini dan memprosesnya dengan sesuai. Ketika klien mengirim pesan Probe untuk layanan, klien dikirim melalui jaringan menggunakan protokol multicast. Setiap layanan yang menerima permintaan menentukan apakah cocok dengan kriteria dalam pesan Probe dan merespons langsung ke klien dengan pesan ProbeMatch jika layanan cocok dengan kriteria yang ditentukan dalam pesan Probe.

Manfaat Menggunakan Penemuan WCF

Karena Penemuan WCF diimplementasikan menggunakan protokol Penemuan WS itu dapat dioperasikan dengan klien, layanan, dan proksi lain yang menerapkan Penemuan WS juga. Penemuan WCF dibangun di atas API WCF yang ada, yang memudahkan untuk menambahkan fungsi penemuan ke layanan dan klien Anda yang ada. Penemuan layanan dapat dengan mudah ditambahkan melalui pengaturan konfigurasi aplikasi. Selain itu, Penemuan WCF juga mendukung penggunaan protokol penemuan melalui transportasi lain seperti net serekan, overlay penamaan, dan HTTP. Penemuan WCF menyediakan dukungan untuk mode operasi Terkelola tempat proksi penemuan digunakan. Ini dapat mengurangi lalu lintas jaringan karena pesan dikirim langsung ke proksi penemuan alih-alih mengirim pesan multicast ke seluruh jaringan. Penemuan WCF juga memungkinkan lebih banyak fleksibilitas saat bekerja dengan layanan Web. Misalnya, Anda dapat mengubah alamat layanan tanpa harus mengonfigurasi ulang klien atau layanan. Ketika klien harus mengakses layanan, klien dapat mengeluarkan pesan Probe melalui permintaan Find dan mengharapkan layanan merespons dengan alamatnya saat ini. Penemuan WCF memungkinkan klien untuk mencari layanan berdasarkan kriteria yang berbeda termasuk jenis kontrak, elemen pengikatan, namespace layanan, cakupan, dan kata kunci atau nomor versi. Penemuan WCF memungkinkan runtime bahasa umum dan penemuan waktu desain. Menambahkan penemuan ke aplikasi Anda dapat digunakan untuk mengaktifkan skenario lain seperti toleransi kesalahan dan konfigurasi otomatis.

Publikasi Layanan

Agar layanan dapat ditemukan, ServiceDiscoveryBehavior harus ditambahkan ke host layanan dan titik akhir penemuan harus ditambahkan untuk menentukan tempat mendengarkan pesan penemuan. Contoh kode berikut menunjukkan bagaimana layanan yang dihost sendiri dapat dimodifikasi agar dapat ditemukan.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

Instans ServiceDiscoveryBehavior harus ditambahkan ke deskripsi layanan agar layanan dapat ditemukan. Instans DiscoveryEndpoint harus ditambahkan ke host layanan untuk memberi tahu layanan tempat mendengarkan permintaan penemuan. Dalam contoh ini, UdpDiscoveryEndpoint (yang berasal dari DiscoveryEndpoint) ditambahkan untuk menentukan bahwa layanan harus mendengarkan permintaan penemuan melalui transportasi multicast UDP. UdpDiscoveryEndpoint digunakan untuk penemuan Ad-Hoc karena semua pesan dikirim dengan cara multicast.

Pengumuman

Secara default, publikasi layanan tidak mengirimkan pesan pengumuman. Layanan harus dikonfigurasi untuk mengirim pesan pengumuman. Layanan ini memberikan fleksibilitas tambahan untuk penulis layanan karena mereka dapat mengumumkan layanan secara terpisah dari mendengarkan pesan penemuan. Pengumuman layanan juga dapat digunakan sebagai mekanisme untuk mendaftarkan layanan dengan proksi penemuan atau registri layanan lainnya. Kode berikut menunjukkan cara mengonfigurasi layanan untuk mengirim pesan pengumuman melalui pengikatan UDP.

Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");

// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
    // Add calculator endpoint
    serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);

    // ** DISCOVERY ** //
    // Make the service discoverable by adding the discovery behavior
    ServiceDiscoveryBehavior discoveryBehavior = new ServiceDiscoveryBehavior();
    serviceHost.Description.Behaviors.Add(discoveryBehavior);

    // Send announcements on UDP multicast transport
    discoveryBehavior.AnnouncementEndpoints.Add(
      new UdpAnnouncementEndpoint());

    // ** DISCOVERY ** //
    // Add the discovery endpoint that specifies where to publish the services
    serviceHost.Description.Endpoints.Add(new UdpDiscoveryEndpoint());

    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.
    Console.WriteLine("Press <ENTER> to terminate service.");
    Console.ReadLine();
}

Penemuan Layanan

Aplikasi klien dapat menggunakan kelas DiscoveryClient untuk menemukan layanan. Pengembang membuat instans kelas DiscoveryClient yang lolos dalam titik akhir penemuan yang menentukan tempat mengirim pesan Probe atau Resolve. Klien kemudian memanggil Find yang menentukan kriteria pencarian dalam instans FindCriteria. Jika layanan yang cocok ditemukan, Find mengembalikan koleksi EndpointDiscoveryMetadata. Kode berikut menunjukkan cara memanggil metode Find lalu menyambungkan ke layanan yang ditemukan.

class Client
{
    static EndpointAddress serviceAddress;
  
    static void Main()
    {  
        if (FindService())
        {
            InvokeService();
        }
    }  
  
    // ** DISCOVERY ** //  
    static bool FindService()  
    {  
        Console.WriteLine("\nFinding Calculator Service ..");  
        DiscoveryClient discoveryClient =
            new DiscoveryClient(new UdpDiscoveryEndpoint());  
  
        Collection<EndpointDiscoveryMetadata> calculatorServices =
            (Collection<EndpointDiscoveryMetadata>)discoveryClient.Find(new FindCriteria(typeof(ICalculator))).Endpoints;  
  
        discoveryClient.Close();  
  
        if (calculatorServices.Count == 0)  
        {  
            Console.WriteLine("\nNo services are found.");  
            return false;  
        }  
        else  
        {  
            serviceAddress = calculatorServices[0].Address;  
            return true;  
        }  
    }  
  
    static void InvokeService()  
    {  
        Console.WriteLine("\nInvoking Calculator Service at {0}\n", serviceAddress);  
  
        // Create a client  
        CalculatorClient client = new CalculatorClient();  
        client.Endpoint.Address = serviceAddress;  
        client.Add(10,3);  
    }
}  

Keamanan Tingkat Penemuan dan Pesan

Saat menggunakan keamanan tingkat pesan, perlu untuk menentukan EndpointIdentity pada titik akhir penemuan layanan dan pencocokan EndpointIdentity pada titik akhir penemuan klien. Untuk informasi selengkapnya tentang keamanan tingkat pesan, lihat Keamanan Pesan.

Penemuan dan Layanan yang Dihosting Web

Agar layanan WCF dapat ditemukan, layanan harus dijalankan. Layanan WCF yang dihosting di bawah IIS atau WAS tidak berjalan sampai IIS/WAS menerima pesan yang terikat untuk layanan, sehingga tidak dapat ditemukan secara default. Ada dua opsi untuk membuat layanan Di-hosting Web yang dapat ditemukan:

  1. Menggunakan fitur Windows Server AppFabric Auto-Start

  2. Menggunakan proksi penemuan untuk berkomunikasi atas nama layanan

Windows Server AppFabric memiliki fitur Mulai Otomatis yang akan memungkinkan layanan dimulai sebelum menerima pesan apa pun. Dengan set Mulai Otomatis ini, layanan yang di-hosting IIS/WAS dapat dikonfigurasi agar dapat ditemukan. Untuk informasi selengkapnya tentang fitur Mulai Otomatis lihat, Windows Fitur Mulai Otomatis AppFabric Server. Seiring dengan mengaktifkan fitur Mulai Otomatis, Anda harus mengonfigurasi layanan untuk penemuan. Untuk informasi selengkapnya, lihat Cara: Menambahkan Penemuan secara Terprogram ke Layanan WCF dan KlienMengonfigurasi Penemuan dalam File Konfigurasi.

Proksi penemuan dapat digunakan untuk berkomunikasi atas nama layanan WCF saat layanan tidak berjalan. Proksi dapat mendengarkan pemeriksaan atau menyelesaikan pesan dan merespons klien. Klien kemudian dapat mengirim pesan langsung ke layanan. Ketika klien mengirim pesan ke layanan, klien akan diibuat instans untuk merespons pesan. Untuk informasi selengkapnya tentang menerapkan proksi penemuan lihat, Menerapkan Proksi Penemuan.

Catatan

Agar Penemuan WCF berfungsi dengan benar, semua NIC (Pengontrol Antarmuka Jaringan) hanya boleh memiliki 1 alamat IP.