Bagikan melalui


Cara: Menambahkan Penemuan secara Terprogram ke Layanan dan Klien WCF

Topik ini menjelaskan cara membuat layanan Windows Communication Foundation (WCF) dapat ditemukan. Ini didasarkan pada sampel Host Mandiri.

Untuk mengonfigurasi sampel layanan Host Mandiri yang ada untuk Penemuan

  1. Buka solusi Host Mandiri di Visual Studio 2012. Sampel terletak di direktori TechnologySamples\Basic\Service\Hosting\SelfHost.

  2. Tambahkan referensi ke System.ServiceModel.Discovery.dll ke proyek layanan. Anda mungkin melihat pesan kesalahan yang mengatakan "System. ServiceModel.Discovery.dll atau salah satu dependensinya memerlukan versi .NET Framework yang lebih baru daripada yang ditentukan dalam proyek ..." Jika Anda melihat pesan ini, klik kanan proyek di Penjelajah Solusi dan pilih Properti. Di jendela Properti Project, pastikan Kerangka Kerja Target adalah .NET Framework 4.6.1.

  3. Buka file Service.cs dan tambahkan arahan berikut using .

    using System.ServiceModel.Discovery;
    
  4. Dalam metode Main(), di dalam pernyataan using, tambahkan instans ServiceDiscoveryBehavior ke host layanan.

    public static void Main()
    {
        // Create a ServiceHost for the CalculatorService type.
        using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
        {
            // Add a ServiceDiscoveryBehavior
            serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
    
            // ...
        }
    }
    

    ServiceDiscoveryBehavior menentukan bahwa layanan tempat penerapan dapat ditemukan.

  5. Tambahkan UdpDiscoveryEndpoint ke host layanan tepat setelah kode yang menambahkan ServiceDiscoveryBehavior.

    // Add ServiceDiscoveryBehavior
    serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
    
    // Add a UdpDiscoveryEndpoint
    serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
    

    Kode ini menentukan bahwa pesan penemuan harus dikirim ke titik akhir penemuan UDP standar.

Untuk membuat aplikasi klien yang menggunakan penemuan untuk memanggil layanan

  1. Tambahkan aplikasi konsol baru ke solusi yang disebut DiscoveryClientApp.

  2. Menambahkan referensi ke System.ServiceModel.dll dan System.ServiceModel.Discovery.dll

  3. Salin file GeneratedClient.cs dan App.config dari proyek klien yang ada ke proyek DiscoveryClientApp baru. Untuk melakukan ini, klik kanan file di Penjelajah Solusi, pilih Salin, lalu pilih proyek DiscoveryClientApp, klik kanan dan pilih Tempel.

  4. Buka Program.cs.

  5. Tambahkan direktif berikut using .

    using System.ServiceModel;
    using System.ServiceModel.Discovery;
    using Microsoft.ServiceModel.Samples;
    
  6. Tambahkan metode statis yang dipanggil FindCalculatorServiceAddress() ke kelas Program.

    static EndpointAddress FindCalculatorServiceAddress()
    {
    }
    

    Metode ini menggunakan penemuan untuk mencari layanan CalculatorService.

  7. Di dalam metode FindCalculatorServiceAddress, buat instans DiscoveryClient baru, teruskan UdpDiscoveryEndpoint ke konstruktor.

    static EndpointAddress FindCalculatorServiceAddress()
    {
        // Create DiscoveryClient
        DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
    }
    

    Ini memberi tahu WCF bahwa kelas DiscoveryClient harus menggunakan titik akhir penemuan UDP standar untuk mengirim dan menerima pesan penemuan.

  8. Pada baris berikutnya, panggil metode Find dan tentukan instans FindCriteria yang berisi kontrak layanan yang ingin Anda cari. Dalam kasus ini, tentukan ICalculator.

    // Find ICalculatorService endpoints
    FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));
    
  9. Setelah panggilan ke Find, periksa untuk melihat apakah setidaknya ada satu layanan yang cocok dan mengembalikan EndpointAddress layanan pencocokan pertama. Jika tidak, mengembalikan null.

    if (findResponse.Endpoints.Count > 0)
    {
        return findResponse.Endpoints[0].Address;
    }
    else
    {
        return null;
    }
    
  10. Tambahkan metode statis yang bernama InvokeCalculatorService ke kelas Program.

    static void InvokeCalculatorService(EndpointAddress endpointAddress)
    {
    }
    

    Metode ini menggunakan alamat titik akhir yang dikembalikan dari FindCalculatorServiceAddress untuk memanggil layanan kalkulator.

  11. Di dalam metode InvokeCalculatorService, buat instans kelas CalculatorServiceClient. Kelas ini didefinisikan oleh sampel Host Mandiri. Ini dihasilkan menggunakan Svcutil.exe.

    // Create a client
    CalculatorClient client = new CalculatorClient();
    
  12. Pada baris berikutnya, atur alamat titik akhir klien ke alamat titik akhir yang dikembalikan dari FindCalculatorServiceAddress().

    // Connect to the discovered service endpoint
    client.Endpoint.Address = endpointAddress;
    
  13. Segera setelah kode untuk langkah sebelumnya, panggil metode yang diekspos oleh layanan kalkulator.

    Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);
    
    double value1 = 100.00D;
    double value2 = 15.99D;
    
    // Call the Add service operation.
    double result = client.Add(value1, value2);
    Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
    
    // Call the Subtract service operation.
    result = client.Subtract(value1, value2);
    Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
    
    // Call the Multiply service operation.
    result = client.Multiply(value1, value2);
    Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
    
    // Call the Divide service operation.
    result = client.Divide(value1, value2);
    Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
    Console.WriteLine();
    
    //Closing the client gracefully closes the connection and cleans up resources
    client.Close();
    
  14. Tambahkan kode ke metode Main() di Program kelas untuk memanggil FindCalculatorServiceAddress.

    public static void Main()
    {
        EndpointAddress endpointAddress = FindCalculatorServiceAddress();
    }
    
  15. Pada baris berikutnya, panggil InvokeCalculatorService() dan teruskan alamat titik akhir yang dikembalikan dari FindCalculatorServiceAddress().

    if (endpointAddress != null)
    {
        InvokeCalculatorService(endpointAddress);
    }
    
    Console.WriteLine("Press <ENTER> to exit.");
    Console.ReadLine();
    

Untuk menguji aplikasi

  1. Buka perintah yang ditingkatkan dan jalankan Service.exe.

  2. Buka perintah dan jalankan Discoveryclientapp.exe.

  3. Output dari service.exe akan terlihat seperti output berikut.

    Received Add(100,15.99)
    Return: 115.99
    Received Subtract(100,15.99)
    Return: 84.01
    Received Multiply(100,15.99)
    Return: 1599
    Received Divide(100,15.99)
    Return: 6.25390869293308
    
  4. Output dari Discoveryclientapp.exe akan terlihat seperti output berikut.

    Invoking CalculatorService at http://localhost:8000/ServiceModelSamples/service
    Add(100,15.99) = 115.99
    Subtract(100,15.99) = 84.01
    Multiply(100,15.99) = 1599
    Divide(100,15.99) = 6.25390869293308
    
    Press <ENTER> to exit.
    

Contoh

Berikut ini adalah daftar kode untuk sampel ini. Karena kode ini didasarkan pada sampel Host Mandiri, hanya file yang diubah yang dicantumkan.

// Service.cs
using System;
using System.Configuration;
using System.ServiceModel;
using System.ServiceModel.Discovery;

namespace Microsoft.ServiceModel.Samples
{
    // See SelfHost sample for service contract and implementation
    // ...

        // Host the service within this EXE console application.
        public static void Main()
        {
            // Create a ServiceHost for the CalculatorService type.
            using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService)))
            {
                // Add the ServiceDiscoveryBehavior to make the service discoverable
                serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
                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("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();
            }
        }
    }
}
// Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Discovery;
using Microsoft.ServiceModel.Samples;
using System.Text;

namespace DiscoveryClientApp
{
    class Program
    {
        static EndpointAddress FindCalculatorServiceAddress()
        {
            // Create DiscoveryClient
            DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());

            // Find ICalculatorService endpoints
            FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));

            if (findResponse.Endpoints.Count > 0)
            {
                return findResponse.Endpoints[0].Address;
            }
            else
            {
                return null;
            }
        }

        static void InvokeCalculatorService(EndpointAddress endpointAddress)
        {
            // Create a client
            CalculatorClient client = new CalculatorClient();

            // Connect to the discovered service endpoint
            client.Endpoint.Address = endpointAddress;

            Console.WriteLine("Invoking CalculatorService at {0}", endpointAddress);

            double value1 = 100.00D;
            double value2 = 15.99D;

            // Call the Add service operation.
            double result = client.Add(value1, value2);
            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

            // Call the Subtract service operation.
            result = client.Subtract(value1, value2);
            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

            // Call the Multiply service operation.
            result = client.Multiply(value1, value2);
            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

            // Call the Divide service operation.
            result = client.Divide(value1, value2);
            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
            Console.WriteLine();

            //Closing the client gracefully closes the connection and cleans up resources
            client.Close();
        }
        static void Main(string[] args)
        {
            EndpointAddress endpointAddress = FindCalculatorServiceAddress();

            if (endpointAddress != null)
            {
                InvokeCalculatorService(endpointAddress);
            }

            Console.WriteLine("Press <ENTER> to exit.");
            Console.ReadLine();

        }
    }
}

Lihat juga