Exemple Basic
L’exemple de découverte de base montre comment rendre un service détectable et comment rechercher et appeler un service détectable. Cet exemple est composé de deux projets : service et client.
Notes
Cet exemple implémente la découverte dans le code. Pour obtenir un exemple qui implémente la découverte dans la configuration, consultez Configuration.
Service
Il s'agit d'une implémentation simple du service de calculatrice. Le code de découverte associé se trouve dans Main
, où un ServiceDiscoveryBehavior est ajouté à l'hôte de service et où un UdpDiscoveryEndpoint est ajouté comme indiqué dans le code suivant.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new
WSHttpBinding(), String.Empty);
// Make the service discoverable over UDP multicast
serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());
serviceHost.Open();
// ...
}
Client
Le client utilise un DynamicEndpoint pour localiser le service. Le DynamicEndpoint, un point de terminaison standard, résout le point de terminaison du service lorsque le client est ouvert. Dans ce cas, le DynamicEndpoint recherche le service en se basant sur son contrat. Le DynamicEndpoint effectue la recherche sur un UdpDiscoveryEndpoint par défaut. Lorsqu’il trouve un point de terminaison de service, le client se connecte à ce service sur la liaison spécifiée.
public static void Main()
{
DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
// ...
}
Le client définit une méthode nommée InvokeCalculatorService
qui utilise la classe DiscoveryClient pour rechercher des services. Le DynamicEndpoint hérite de ServiceEndpoint, de sorte qu'il peut être passé à la méthode InvokeCalculatorService
. L'exemple utilise ensuite le DynamicEndpoint pour créer une instance de CalculatorServiceClient
et appelle les différentes opérations du service de calculatrice.
static void InvokeCalculatorService(ServiceEndpoint serviceEndpoint)
{
// Create a client
CalculatorServiceClient client = new CalculatorServiceClient(serviceEndpoint);
Console.WriteLine("Invoking CalculatorService");
Console.WriteLine();
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();
}
Pour utiliser cet exemple
Cet exemple utilise des points de terminaison HTTP et pour exécuter cet exemple, des listes de contrôle d'accès (ACL) d'URL appropriées doivent être ajoutées. Pour plus d’informations, consultez Configuration de HTTP et HTTPS. L'exécution de la commande suivante avec un privilège élevé doit ajouter les ACL appropriées. Vous pouvez substituer vos domaine et nom d’utilisateur aux arguments suivants si la commande ne fonctionne pas telle quelle.
netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%
À l’aide de Visual Studio, ouvrez Basic.sln et générez l’exemple.
Exécutez l'application service.exe.
Une fois le service démarré, exécutez client.exe.
Observez que le client a trouvé le service sans connaître son adresse.