Procedure: Programmatisch detectie toevoegen aan een WCF-service en -client
In dit onderwerp wordt uitgelegd hoe u een WCF-service (Windows Communication Foundation) detecteerbaar maakt. Deze is gebaseerd op het self-hostvoorbeeld .
Het bestaande self-hostservicevoorbeeld voor Detectie configureren
Open de self-hostoplossing in Visual Studio 2012. Het voorbeeld bevindt zich in de map TechnologySamples\Basic\Service\Hosting\SelfHost.
Voeg een verwijzing naar
System.ServiceModel.Discovery.dll
het serviceproject toe. Mogelijk ziet u een foutbericht met de tekst 'Systeem. ServiceModel.Discovery.dll of een van de bijbehorende afhankelijkheden vereist een latere versie van .NET Framework dan de versie die is opgegeven in het project ..." Als u dit bericht ziet, klikt u met de rechtermuisknop op het project in Solution Explorer en kiest u Eigenschappen. Zorg ervoor dat het doelframework .NET Framework 4.6.1 is in het venster Projecteigenschappen.Open het bestand Service.cs en voeg de volgende
using
instructie toe.using System.ServiceModel.Discovery;
Voeg in de
Main()
methode in deusing
instructie een ServiceDiscoveryBehavior exemplaar toe aan de servicehost.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()); // ... } }
Hiermee ServiceDiscoveryBehavior geeft u op dat de service waarop deze wordt toegepast, detecteerbaar is.
Voeg direct na de code waarmee de servicehost wordt toegevoegd een UdpDiscoveryEndpoint aan de ServiceDiscoveryBehaviorservicehost toe.
// Add ServiceDiscoveryBehavior serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); // Add a UdpDiscoveryEndpoint serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
Deze code geeft aan dat detectieberichten moeten worden verzonden naar het standaard UDP-detectie-eindpunt.
Een clienttoepassing maken die gebruikmaakt van detectie om de service aan te roepen
Voeg een nieuwe consoletoepassing toe aan de oplossing met de naam
DiscoveryClientApp
.Een verwijzing toevoegen aan
System.ServiceModel.dll
enSystem.ServiceModel.Discovery.dll
Kopieer de GeneratedClient.cs- en App.config-bestanden van het bestaande clientproject naar het nieuwe DiscoveryClientApp-project. Klik hiervoor met de rechtermuisknop op de bestanden in Solution Explorer, selecteer Kopiëren en selecteer vervolgens het DiscoveryClientApp-project , klik met de rechtermuisknop en selecteer Plakken.
Open Program.cs.
Voeg de volgende
using
instructies toe.using System.ServiceModel; using System.ServiceModel.Discovery; using Microsoft.ServiceModel.Samples;
Voeg een statische methode toe die aan de
Program
klasse wordt aangeroepenFindCalculatorServiceAddress()
.static EndpointAddress FindCalculatorServiceAddress() { }
Deze methode maakt gebruik van detectie om naar de
CalculatorService
service te zoeken.Maak in de
FindCalculatorServiceAddress
methode een nieuw DiscoveryClient exemplaar, waarbij een UdpDiscoveryEndpoint aan de constructor wordt doorgegeven.static EndpointAddress FindCalculatorServiceAddress() { // Create DiscoveryClient DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint()); }
Dit vertelt WCF dat de DiscoveryClient klasse het standaard UDP-detectie-eindpunt moet gebruiken om detectieberichten te verzenden en te ontvangen.
Roep op de volgende regel de Find methode aan en geef een FindCriteria exemplaar op dat het servicecontract bevat waarnaar u wilt zoeken. Geef
ICalculator
in dit geval op.// Find ICalculatorService endpoints FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(ICalculator)));
Controleer na de aanroep om Findte controleren of er ten minste één overeenkomende service is en de eerste overeenkomende service retourneert EndpointAddress . Retourneer anders
null
.if (findResponse.Endpoints.Count > 0) { return findResponse.Endpoints[0].Address; } else { return null; }
Voeg een statische methode toe met de naam
InvokeCalculatorService
aan deProgram
klasse.static void InvokeCalculatorService(EndpointAddress endpointAddress) { }
Deze methode gebruikt het eindpuntadres dat wordt geretourneerd om
FindCalculatorServiceAddress
de rekenmachineservice aan te roepen.Maak in de
InvokeCalculatorService
methode een exemplaar van deCalculatorServiceClient
klasse. Deze klasse wordt gedefinieerd door het self-hostvoorbeeld . Deze is gegenereerd met behulp van Svcutil.exe.// Create a client CalculatorClient client = new CalculatorClient();
Stel op de volgende regel het eindpuntadres van de client in op het eindpuntadres dat wordt geretourneerd door
FindCalculatorServiceAddress()
.// Connect to the discovered service endpoint client.Endpoint.Address = endpointAddress;
Onmiddellijk na de code voor de vorige stap roept u de methoden aan die worden weergegeven door de rekenmachineservice.
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();
Voeg code toe aan de
Main()
methode in deProgram
klasse die moet worden aangeroepenFindCalculatorServiceAddress
.public static void Main() { EndpointAddress endpointAddress = FindCalculatorServiceAddress(); }
Roep op de volgende regel het
InvokeCalculatorService()
eindpuntadres aan dat is geretourneerd doorFindCalculatorServiceAddress()
.if (endpointAddress != null) { InvokeCalculatorService(endpointAddress); } Console.WriteLine("Press <ENTER> to exit."); Console.ReadLine();
De toepassing testen
Open een opdrachtprompt met verhoogde bevoegdheid en voer Service.exe uit.
Open een opdrachtprompt en voer Discoveryclientapp.exe uit.
De uitvoer van service.exe moet eruitzien als de volgende uitvoer.
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
De uitvoer van Discoveryclientapp.exe moet eruitzien als de volgende uitvoer.
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.
Opmerking
Hier volgt een lijst met de code voor dit voorbeeld. Omdat deze code is gebaseerd op het self-hostvoorbeeld , worden alleen de bestanden vermeld die worden gewijzigd.
// 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();
}
}
}