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
Buka solusi Host Mandiri di Visual Studio 2012. Sampel terletak di direktori TechnologySamples\Basic\Service\Hosting\SelfHost.
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.Buka file Service.cs dan tambahkan arahan berikut
using
.using System.ServiceModel.Discovery;
Dalam metode
Main()
, di dalam pernyataanusing
, 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.
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
Tambahkan aplikasi konsol baru ke solusi yang disebut
DiscoveryClientApp
.Menambahkan referensi ke
System.ServiceModel.dll
danSystem.ServiceModel.Discovery.dll
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.
Buka Program.cs.
Tambahkan direktif berikut
using
.using System.ServiceModel; using System.ServiceModel.Discovery; using Microsoft.ServiceModel.Samples;
Tambahkan metode statis yang dipanggil
FindCalculatorServiceAddress()
ke kelasProgram
.static EndpointAddress FindCalculatorServiceAddress() { }
Metode ini menggunakan penemuan untuk mencari layanan
CalculatorService
.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.
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)));
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; }
Tambahkan metode statis yang bernama
InvokeCalculatorService
ke kelasProgram
.static void InvokeCalculatorService(EndpointAddress endpointAddress) { }
Metode ini menggunakan alamat titik akhir yang dikembalikan dari
FindCalculatorServiceAddress
untuk memanggil layanan kalkulator.Di dalam metode
InvokeCalculatorService
, buat instans kelasCalculatorServiceClient
. Kelas ini didefinisikan oleh sampel Host Mandiri. Ini dihasilkan menggunakan Svcutil.exe.// Create a client CalculatorClient client = new CalculatorClient();
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;
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();
Tambahkan kode ke metode
Main()
diProgram
kelas untuk memanggilFindCalculatorServiceAddress
.public static void Main() { EndpointAddress endpointAddress = FindCalculatorServiceAddress(); }
Pada baris berikutnya, panggil
InvokeCalculatorService()
dan teruskan alamat titik akhir yang dikembalikan dariFindCalculatorServiceAddress()
.if (endpointAddress != null) { InvokeCalculatorService(endpointAddress); } Console.WriteLine("Press <ENTER> to exit."); Console.ReadLine();
Untuk menguji aplikasi
Buka perintah yang ditingkatkan dan jalankan Service.exe.
Buka perintah dan jalankan Discoveryclientapp.exe.
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
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();
}
}
}