Suchankündigungen und AnkündigungsclientDiscovery Announcements and Announcement Client

Die WCFWCF-Suchfunktion aktiviert Komponenten, um ihre Verfügbarkeit anzukündigen.The WCFWCF discovery feature enables components to announce their availability. Bei entsprechender Konfiguration sendet ein Dienst Hello- und Bye-Ankündigungen.If configured to do so, a service sends Hello and Bye announcements. Clients oder andere Komponenten können eine Überwachung auf diese Ankündigungsnachrichten durchführen und dann reagieren.Clients or other components can listen for such announcement messages and act on them. Dies stellt für Clients eine alternative Methode zum Erkennen von Diensten dar.This provides an alternative method for clients to be aware of services. Die Ankündigungsfunktion hat mehrere Verwendungen. Falls die Dienste ein Netzwerk z. B. häufig "betreten" und wieder verlassen, sind Ankündigungen ggf. eine bessere Möglichkeit als das Suchen nach Diensten.Announcement functionality has several uses, for example, if the services enter and leave a network frequently, announcements may be a better alternative than searching for services. Bei diesem Ansatz wird der Netzwerkverkehr reduziert, und der Client ist über das Vorhandensein bzw. das Verlassen des Diensts informiert, sobald er die Ankündigungen empfangen hat.With this approach, the network traffic is reduced and the client can learn about the presence or departure of the service as soon as announcements are received.

SuchankündigungenDiscovery Announcements

Wenn ein für Ankündigungen konfigurierter Dienst ein Netzwerk in ein Netzwerk eintritt und erkennbar wird, sendet er eine Hello-Nachricht und kündigt den abhörenden Clients auf diese Weise seine Verfügbarkeit an.When a service configured for announcements joins a network and becomes discoverable, it sends a Hello message announcing its availability to listening clients. Die Nachricht enthält die Suche betreffende Informationen zum Dienst, z. B. Vertrag, Endpunktadresse und zugeordnete Bereiche.The message contains discovery related information about the service, such as its contract, endpoint address and associated scopes. Sie können angeben, wohin die Ankündigungsnachricht gesendet wird, indem Sie die AnnouncementEndpoint-Klasse verwenden.You can specify where the announcement message is sent with the AnnouncementEndpoint class. Wenn der Ankündigungsendpunkt ein UdpAnnouncementEndpoint ist, wird für Hello und Bye entsprechend ein Multicast durchgeführt. Wenn der Ankündigungsendpunkt das Unicast-Format aufweist, werden die Nachrichten direkt an den angegebenen Endpunkt gesendet.If the announcement endpoint is a UdpAnnouncementEndpoint then the Hello and Bye are multicast appropriately, or if the announcement endpoint is unicast, the messages are sent directly to the specified endpoint.

Hinweis

Ankündigungen werden gesendet, wenn der Diensthost geöffnet oder geschlossen wird.Announcements are sent when the service host opens and closes. Falls diese Aufrufe nicht ordnungsgemäß abgeschlossen werden, wird die Ankündigungsnachricht ggf. nicht gesendet. Tritt bei der Ausführung des Diensts z. B. ein Fehler auf, wird die Bye-Ankündigungsnachricht nicht gesendet.If these calls do not finish properly the announcement message may not be sent out. For example if the service faults, then the Bye announcement message is not sent.

Tipp

Sie können die Ankündigungsfunktion so anpassen, dass Sie Ankündigungen jederzeit senden können.You can customize the announcement functionality, allowing you to send announcements whenever you choose.

.NET Framework 4.6.1.NET Framework 4.6.1 definiert AnnouncementEndpoint und UdpAnnouncementEndpoint als Standardendpunkte, damit Dienste und Clients auf einfache Weise Hello- und Bye-Ankündigungen senden können. defines the AnnouncementEndpoint and UdpAnnouncementEndpoint as standard endpoints to allow services and clients to easily send Hello and Bye announcements.

Ankündigungen des DienstsAnnouncements on the Service

Um den Dienst für das Senden von Ankündigungen zu konfigurieren, fügen Sie ein ServiceDiscoveryBehavior-Objekt mit einem Ankündigungsendpunkt hinzu.To configure the service to send announcements, add a ServiceDiscoveryBehavior with an announcement endpoint. Im folgenden Beispiel wird gezeigt, wie Sie dieses Verhalten dem Diensthost programmgesteuert hinzufügen.The following example shows how to programmatically add this behavior to the service host. In diesem Beispiel wird UdpAnnouncementEndpoint verwendet. Dies bedeutet, dass die Ankündigungen per Multicast an einen Ort gesendet werden, der von diesem Standardendpunkt angegeben wird.This example uses the UdpAnnouncementEndpoint, which implies that the announcements are multicast to a location specified by that standard endpoint.

ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior();
serviceDiscoveryBehavior.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint());
serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior);

Das Verhalten kann auch in der Konfigurationsdatei konfiguriert werden, wie im folgenden Beispiel gezeigt.The behavior can be configured in the configuration file as well, as shown in the following example.

<services>
  <service behaviorConfiguration="CalculatorBehavior" name="Microsoft.Samples.Discovery.CalculatorService">
    <!--Add Discovery Endpoint-->
    <endpoint name="udpDiscoveryEpt" kind="udpDiscoveryEndpoint" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorBehavior">
      <!--Add Discovery behavior-->
      <serviceDiscovery>
        <announcementEndpoints>
          <endpoint kind="udpAnnouncementEndpoint" />
        </announcementEndpoints>
      </serviceDiscovery>
    </behavior>
  </serviceBehaviors>
</behaviors>  

In den vorangehenden Beispielen wird ein Dienst so konfiguriert, dass er automatisch Ankündigungsnachrichten sendet.The preceding examples configure a service to automatically send announcement messages. Mit der AnnouncementClient-Klasse können Sie Ankündigungsnachrichten auch explizit senden.You can also send announcement messages explicitly by using the AnnouncementClient class.

Ankündigungen auf dem ClientAnnouncements on the Client

Eine Clientanwendung muss einen Ankündigungsdienst hosten, um auf die Hello- und Bye-Nachrichten reagieren und die Ereignisse OnlineAnnouncementReceived und OfflineAnnouncementReceived abonnieren zu können.A client application must host an announcement service to respond to the Hello and Bye messages and subscribe to the OnlineAnnouncementReceived and OfflineAnnouncementReceived events. Das folgende Beispiel zeigt die dazu erforderliche Vorgehensweise.The following example shows how to do this.

// Create an AnnouncementService instance
AnnouncementService announcementService = new AnnouncementService();

// Subscribe the announcement events
announcementService.OnlineAnnouncementReceived += OnOnlineEvent;
announcementService.OfflineAnnouncementReceived += OnOfflineEvent;

// Create ServiceHost for the AnnouncementService
using (ServiceHost announcementServiceHost = new ServiceHost(announcementService))
{  
    // Listen for the announcements sent over UDP multicast
    announcementServiceHost.AddServiceEndpoint(new UdpAnnouncementEndpoint());
    announcementServiceHost.Open();

    Console.WriteLine("Press <ENTER> to terminate.");
    Console.ReadLine();
}  

Wenn ein Hello- oder Bye-Nachricht empfangen wird, können Sie auf die Endpunkt-Suchmetadaten über AnnouncementEventArgs zugreifen. Dies wird im folgenden Beispiel veranschaulicht.When a Hello or Bye message is received, you can access the endpoint discovery metadata through AnnouncementEventArgs as shown in the following example.

static void OnOnlineEvent(object sender, AnnouncementEventArgs e)
{
    Console.WriteLine("Received an online announcement from {0}", 
e.EndpointDiscoveryMetadata.Address);
}

static void OnOfflineEvent(object sender, AnnouncementEventArgs e)
{
    Console.WriteLine("Received an offline announcement from {0}", 
e.EndpointDiscoveryMetadata.Address);
}