Gör så här: Lägg programmatiskt till identifieringsbarhet till en WCF-tjänst och -klient
Det här avsnittet beskriver hur du gör en WCF-tjänst (Windows Communication Foundation) identifierbar. Den baseras på exemplet Självvärd .
Så här konfigurerar du det befintliga självvärdtjänstexemplet för identifiering
Öppna självvärdslösningen i Visual Studio 2012. Exemplet finns i katalogen TechnologySamples\Basic\Service\Hosting\SelfHost.
Lägg till en referens till
System.ServiceModel.Discovery.dll
tjänstprojektet. Du kan se ett felmeddelande med texten "System. ServiceModel.Discovery.dll eller något av dess beroenden kräver en senare version av .NET Framework än den som anges i projektet ..." Om du ser det här meddelandet högerklickar du på projektet i Solution Explorer och väljer Egenskaper. I fönstret Projektegenskaper kontrollerar du att Target Framework är .NET Framework 4.6.1.Öppna filen Service.cs och lägg till följande
using
direktiv.using System.ServiceModel.Discovery;
Main()
I -metoden i -instruktionenusing
lägger du till en ServiceDiscoveryBehavior instans till tjänstvärden.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 Anger att den tjänst som den tillämpas på kan identifieras.
Lägg till en UdpDiscoveryEndpoint till tjänstvärden direkt efter koden som lägger till ServiceDiscoveryBehavior.
// Add ServiceDiscoveryBehavior serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); // Add a UdpDiscoveryEndpoint serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
Den här koden anger att identifieringsmeddelanden ska skickas till UDP-standardidentifieringsslutpunkten.
Skapa ett klientprogram som använder identifiering för att anropa tjänsten
Lägg till ett nytt konsolprogram i lösningen med namnet
DiscoveryClientApp
.Lägg till en referens till
System.ServiceModel.dll
ochSystem.ServiceModel.Discovery.dll
Kopiera filerna GeneratedClient.cs och App.config från det befintliga klientprojektet till det nya DiscoveryClientApp-projektet. Det gör du genom att högerklicka på filerna i Solution Explorer, välja Kopiera och sedan välja projektet DiscoveryClientApp , högerklicka och välja Klistra in.
Öppna Program.cs.
Lägg till följande
using
direktiv.using System.ServiceModel; using System.ServiceModel.Discovery; using Microsoft.ServiceModel.Samples;
Lägg till en statisk metod som heter
FindCalculatorServiceAddress()
tillProgram
klassen.static EndpointAddress FindCalculatorServiceAddress() { }
Den här metoden använder identifiering för att söka
CalculatorService
efter tjänsten.FindCalculatorServiceAddress
I metoden skapar du en ny DiscoveryClient instans och skickar en UdpDiscoveryEndpoint till konstruktorn.static EndpointAddress FindCalculatorServiceAddress() { // Create DiscoveryClient DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint()); }
Detta talar om för WCF att DiscoveryClient klassen ska använda UDP-standardidentifieringsslutpunkten för att skicka och ta emot identifieringsmeddelanden.
På nästa rad anropar Find du metoden och anger en FindCriteria instans som innehåller det tjänstkontrakt som du vill söka efter. I det här fallet anger du
ICalculator
.// Find ICalculatorService endpoints FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));
Efter anropet till Findkontrollerar du om det finns minst en matchande tjänst och returnerar den EndpointAddress första matchande tjänsten. Annars returnerar du
null
.if (findResponse.Endpoints.Count > 0) { return findResponse.Endpoints[0].Address; } else { return null; }
Lägg till en statisk metod med namnet
InvokeCalculatorService
iProgram
klassen.static void InvokeCalculatorService(EndpointAddress endpointAddress) { }
Den här metoden använder slutpunktsadressen som returneras från
FindCalculatorServiceAddress
för att anropa kalkylatortjänsten.InvokeCalculatorService
I metoden skapar du en instans avCalculatorServiceClient
klassen. Den här klassen definieras av självvärdexemplet . Det genererades med hjälp av Svcutil.exe.// Create a client CalculatorClient client = new CalculatorClient();
På nästa rad anger du slutpunktsadressen för klienten till den slutpunktsadress som returneras från
FindCalculatorServiceAddress()
.// Connect to the discovered service endpoint client.Endpoint.Address = endpointAddress;
Omedelbart efter koden för föregående steg anropar du de metoder som exponeras av kalkylatortjänsten.
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();
Lägg till kod i
Main()
-metoden iProgram
klassen för att anropaFindCalculatorServiceAddress
.public static void Main() { EndpointAddress endpointAddress = FindCalculatorServiceAddress(); }
På nästa rad anropar
InvokeCalculatorService()
du och skickar den slutpunktsadress som returneras frånFindCalculatorServiceAddress()
.if (endpointAddress != null) { InvokeCalculatorService(endpointAddress); } Console.WriteLine("Press <ENTER> to exit."); Console.ReadLine();
Testa programmet
Öppna en upphöjd kommandotolk och kör Service.exe.
Öppna en kommandotolk och kör Discoveryclientapp.exe.
Utdata från service.exe bör se ut som följande utdata.
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
Utdata från Discoveryclientapp.exe bör se ut som följande utdata.
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.
Exempel
Följande är en lista över koden för det här exemplet. Eftersom den här koden baseras på självvärdexemplet visas endast de filer som ändras.
// 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();
}
}
}