Udostępnij za pośrednictwem


Anonsy odnajdywania i klient anonsów

Funkcja odnajdywania WCF umożliwia składnikom ogłaszanie ich dostępności. Jeśli zostało to skonfigurowane, usługa wysyła anonse Hello i Bye. Klienci lub inne składniki mogą nasłuchiwać takich komunikatów ogłoszeniowych i reagować na nie. Zapewnia to alternatywną metodę dla klientów, by byli świadomi usług. Funkcja anonsu ma kilka zastosowań, na przykład jeśli usługi wchodzą i opuszczają sieć często, ogłoszenia mogą być lepszym rozwiązaniem niż wyszukiwanie usług. Dzięki temu ruch sieciowy jest ograniczany i klient może dowiedzieć się więcej o obecności lub odejściu usługi, gdy tylko zostaną odebrane ogłoszenia.

Ogłoszenia dotyczące odnajdywania

Gdy usługa skonfigurowana pod kątem anonsów dołącza do sieci i staje się wykrywalna, wysyła komunikat Hello ogłaszający dostępność klientów nasłuchujących. Komunikat zawiera informacje dotyczące odnajdywania powiązane z usługą, takie jak jego kontrakt, adres punktu końcowego i skojarzone zakresy. Możesz określić, gdzie komunikat anonsu jest wysyłany z klasą AnnouncementEndpoint . Jeśli punkt końcowy ogłoszenia to UdpAnnouncementEndpoint, wtedy komunikaty "Hello" i "Bye" są rozsyłane przez multiemisję zgodnie z przeznaczeniem, a jeśli punkt końcowy ogłoszenia jest unicastem, komunikaty są wysyłane bezpośrednio do określonego punktu końcowego.

Uwaga / Notatka

Anonse są wysyłane po otwarciu i zamknięciu hosta usługi. Jeśli te wywołania nie zakończą się poprawnie, komunikat o anonsie może nie zostać wysłany. Na przykład, jeśli nastąpi awaria usługi, komunikat o pożegnaniu nie jest wysyłany.

Wskazówka

Możesz dostosować funkcję anonsu, umożliwiając wysyłanie anonsów za każdym razem, gdy wybierzesz.

Program .NET Framework 4.6.1 definiuje AnnouncementEndpoint i UdpAnnouncementEndpoint jako standardowe punkty końcowe, aby umożliwić usługom i klientom łatwe wysyłanie anonsów typu "Hello" i "Bye".

Ogłoszenia dotyczące usługi

Aby skonfigurować usługę do wysyłania anonsów, dodaj element ServiceDiscoveryBehavior z punktem końcowym anonsu. W poniższym przykładzie pokazano, jak programowo dodać to zachowanie do hosta usługi. W tym przykładzie użyto elementu UdpAnnouncementEndpoint, co oznacza, że anonse są multikastowane do lokalizacji określonej przez ten standardowy punkt końcowy.

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

Zachowanie można również skonfigurować w pliku konfiguracji, jak pokazano w poniższym przykładzie.

<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>

Powyższe przykłady umożliwiają skonfigurowanie usługi w celu automatycznego wysyłania komunikatów o anonsach. Możesz również wysyłać komunikaty ogłoszeniowe jawnie, korzystając z klasy AnnouncementClient.

Ogłoszenia dotyczące klienta

Aplikacja kliencka musi hostować usługę ogłoszeń, aby reagować na komunikaty Hello i Bye oraz subskrybować wydarzenia OnlineAnnouncementReceived i OfflineAnnouncementReceived. W poniższym przykładzie pokazano, jak to zrobić.

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

Po odebraniu komunikatu Hello lub Bye można uzyskać dostęp do metadanych odnajdywania punktów końcowych przez AnnouncementEventArgs, jak pokazano w poniższym przykładzie.

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