Einfaches Beispiel

In dem Beispiel zur grundlegenden Suche wird erläutert, wie ein Dienst sichtbar gemacht wird und wie nach einem sichtbaren Dienst gesucht und dieser aufgerufen wird. Dieses Beispiel besteht aus zwei Projekten: Dienst und Client.

Hinweis

In diesem Beispiel wird die Suche in Code implementiert. Ein Beispiel, in dem die Suche in die Konfiguration implementiert wird, finden Sie unter Konfiguration.

Dienst

Dies ist eine einfache Rechnerdienstimplementierung. Der mit der Suche verbundene Code befindet sich in Main. Dort wird dem Diensthost ein ServiceDiscoveryBehavior hinzugefügt, und es wird wie im folgenden Code dargestellt ein UdpDiscoveryEndpoint hinzugefügt.

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

Der Client verwendet einen DynamicEndpoint, um den Dienst zu ermitteln. Der DynamicEndpoint, ein Standardendpunkt, löst den Endpunkt des Diensts auf, wenn der Client geöffnet wird. In diesem Fall sucht der DynamicEndpoint auf Grundlage des Dienstvertrags nach dem Dienst. Der DynamicEndpoint führt die Suche standardmäßig über einen UdpDiscoveryEndpoint durch. Sobald ein Dienstendpunkt gefunden wurde, stellt der Client über die angegebene Bindung eine Verbindung mit dem Dienst her.

public static void Main()
{
   DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding());
   // ...
}

Der Client definiert eine Methode namens InvokeCalculatorService, die mithilfe der DiscoveryClient-Klasse nach verfügbaren Diensten sucht. Der DynamicEndpoint erbt vom ServiceEndpoint. Deshalb kann er an die InvokeCalculatorService-Methode übergeben werden. Im Beispiel wird dann mithilfe des DynamicEndpoint eine Instanz des CalculatorServiceClient erstellt und die verschiedenen Vorgänge des Rechnerdiensts aufgerufen.

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();
}

So verwenden Sie dieses Beispiel

  1. In diesem Beispiel werden HTTP-Endpunkte verwendet. Zur Ausführung des Beispiels müssen die richtigen URL-ACLs hinzugefügt werden. Weitere Informationen finden Sie unter Konfigurieren von HTTP und HTTPS. Durch die Ausführung des folgenden Befehls mit erweiterten Berechtigungen werden die entsprechenden ACLs hinzugefügt. Es empfiehlt sich, die Domäne und den Benutzernamen durch die folgenden Argumente zu ersetzen, wenn der Befehl nicht funktioniert. netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%

  2. Öffnen Sie mit Visual Studio die Datei „Basic.sln“, und erstellen Sie das Beispiel.

  3. Führen Sie die SERVICE.EXE-Anwendung aus.

  4. Führen Sie nach dem Starten des Diensts client.exe aus.

  5. Beachten Sie, dass der Client den Dienst ermitteln konnte, ohne seine Adresse zu kennen.