Omówienie odnajdywania WCF
Interfejsy API odnajdywania zapewniają ujednolicony model programowania na potrzeby dynamicznej publikacji i odnajdywania usług sieci Web przy użyciu protokołu WS-Discovery. Te interfejsy API umożliwiają usługom publikowanie siebie i klientów w celu znalezienia opublikowanych usług. Po odnalezieniu usługi usługa ma możliwość wysyłania komunikatów o anonsach, a także nasłuchiwania żądań odnajdywania i odpowiadania na nie. Wykrywalne usługi mogą wysyłać wiadomości Hello, aby ogłosić ich przybycie do sieci i wiadomości Bye, aby ogłosić ich odejście z sieci. Aby znaleźć usługę Probe
, klienci wysyłają żądanie zawierające określone kryteria, takie jak typ kontraktu usługi, słowa kluczowe i zakres w sieci. Usługi otrzymują Probe
żądanie i określają, czy spełniają kryteria. Jeśli usługa jest zgodna, odpowiada, wysyłając ProbeMatch
komunikat z powrotem do klienta z informacjami niezbędnymi do skontaktowania się z usługą. Klienci mogą również wysyłać Resolve
żądania, które umożliwiają im znajdowanie usług, które mogły zmienić adres punktu końcowego. Pasujące usługi odpowiadają na Resolve
żądania, wysyłając ResolveMatch
komunikat z powrotem do klienta.
Tryby ad hoc i zarządzane
Interfejs API odnajdywania obsługuje dwa różne tryby: zarządzany i ad hoc. W trybie zarządzanym istnieje scentralizowany serwer o nazwie serwer proxy odnajdywania, który przechowuje informacje o dostępnych usługach. Serwer proxy odnajdywania można wypełnić informacjami o usługach na różne sposoby. Na przykład usługi mogą wysyłać komunikaty anonsów podczas uruchamiania do serwera proxy odnajdywania lub serwer proxy może odczytywać dane z bazy danych lub pliku konfiguracji, aby określić, jakie usługi są dostępne. Sposób wypełniania serwera proxy odnajdywania jest całkowicie do dewelopera. Klienci używają serwera proxy odnajdywania do pobierania informacji o dostępnych usługach. Gdy klient wyszukuje usługę Probe
, wysyła komunikat do serwera proxy odnajdywania, a serwer proxy określa, czy którekolwiek z usług, które zna, są zgodne z usługą szukaną przez klienta. Jeśli istnieją dopasowania, serwer proxy odnajdywania wysyła ProbeMatch
odpowiedź z powrotem do klienta. Klient może następnie skontaktować się z usługą bezpośrednio przy użyciu informacji o usłudze zwróconych z serwera proxy. Kluczową zasadą trybu zarządzanego jest to, że żądania odnajdywania są wysyłane w sposób emisji pojedynczej do jednego urzędu, serwera proxy odnajdywania. Program .NET Framework zawiera kluczowe składniki, które umożliwiają tworzenie własnego serwera proxy. Klienci i usługi mogą zlokalizować serwer proxy za pomocą wielu metod:
Serwer proxy może odpowiedzieć na komunikaty ad hoc.
Serwer proxy może wysłać komunikat anonsu podczas uruchamiania.
Klienci i usługi można napisać w celu wyszukania określonego dobrze znanego punktu końcowego.
W trybie ad hoc nie ma scentralizowanego serwera. Wszystkie komunikaty odnajdywania, takie jak anonsy usług i żądania klientów, są wysyłane w trybie multiemisji. Domyślnie program .NET Framework zawiera obsługę odnajdywania ad hoc za pośrednictwem protokołu UDP. Jeśli na przykład usługa jest skonfigurowana do wysyłania anonsu Hello podczas uruchamiania, wysyła go za pośrednictwem dobrze znanego adresu multiemisji przy użyciu protokołu UDP. Klienci muszą aktywnie słuchać tych anonsów i odpowiednio je przetwarzać. Gdy klient wysyła Probe
komunikat dla usługi, jest wysyłany przez sieć przy użyciu protokołu multiemisji. Każda usługa, która odbiera żądanie, określa, czy spełnia kryteria w Probe
komunikacie i odpowiada bezpośrednio klientowi za pomocą komunikatu ProbeMatch
, jeśli usługa spełnia kryteria określone w Probe
komunikacie.
Zalety korzystania z odnajdywania WCF
Ponieważ odnajdywanie WCF jest implementowane przy użyciu protokołu WS-Discovery, jest ono możliwe do współdziałania z innymi klientami, usługami i serwerami proxy, które implementują również odnajdywanie WS-Discovery. Odnajdywanie WCF jest oparte na istniejących interfejsach API programu WCF, co ułatwia dodawanie funkcji odnajdywania do istniejących usług i klientów. Odnajdywanie usługi można łatwo dodać za pomocą ustawień konfiguracji aplikacji. Ponadto odnajdywanie WCF obsługuje również używanie protokołu odnajdywania za pośrednictwem innych transportów, takich jak sieć równorzędna, nakładka nazewnictwa i protokół HTTP. Odnajdywanie WCF zapewnia obsługę trybu zarządzanego operacji, w którym jest używany serwer proxy odnajdywania. Może to zmniejszyć ruch sieciowy, ponieważ komunikaty są wysyłane bezpośrednio do serwera proxy odnajdywania zamiast wysyłania komunikatów multiemisji do całej sieci. Odnajdywanie WCF umożliwia również większą elastyczność podczas pracy z usługami sieci Web. Można na przykład zmienić adres usługi bez konieczności ponownego konfigurowania klienta lub usługi. Gdy klient musi uzyskać dostęp do usługi, może wysłać Probe
komunikat za pośrednictwem Find
żądania i oczekiwać, że usługa odpowie przy użyciu bieżącego adresu. Odnajdywanie WCF umożliwia klientowi wyszukiwanie usługi na podstawie różnych kryteriów, w tym typów kontraktów, elementów powiązania, przestrzeni nazw, zakresu i słów kluczowych lub numerów wersji. Odnajdywanie WCF umożliwia odnajdywanie czasu wykonywania i projektowania. Dodanie odnajdywania do aplikacji może służyć do włączania innych scenariuszy, takich jak odporność na uszkodzenia i automatyczna konfiguracja.
Publikacja usługi
Aby można było odnaleźć usługę, ServiceDiscoveryBehavior należy dodać element do hosta usługi, a punkt końcowy odnajdywania należy dodać, aby określić miejsce nasłuchiwania komunikatów odnajdywania. W poniższym przykładzie kodu pokazano, jak można zmodyfikować usługę self-hosted, aby umożliwić jej odnajdywanie.
Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");
// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
// Add calculator endpoint
serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);
// ** DISCOVERY ** //
// Make the service discoverable by adding the discovery behavior
serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
// ** DISCOVERY ** //
// Add the discovery endpoint that specifies where to publish the services
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("Press <ENTER> to terminate service.");
Console.ReadLine();
}
Aby ServiceDiscoveryBehavior można było odnaleźć usługę, należy dodać wystąpienie do opisu usługi. Wystąpienie DiscoveryEndpoint należy dodać do hosta usługi, aby poinformować usługę, gdzie należy nasłuchiwać żądań odnajdywania. W tym przykładzie dodawany jest element UdpDiscoveryEndpoint (pochodzący z DiscoveryEndpointelementu ) w celu określenia, że usługa powinna nasłuchiwać żądań odnajdywania w ramach transportu multiemisji UDP. Element UdpDiscoveryEndpoint jest używany do odnajdywania ad hoc, ponieważ wszystkie komunikaty są wysyłane w trybie multiemisji.
Ogłoszenie
Domyślnie publikacja usługi nie wysyła komunikatów o anonsach. Usługa musi być skonfigurowana do wysyłania komunikatów o anonsach. Zapewnia to dodatkową elastyczność dla składników zapisywania usług, ponieważ mogą one ogłaszać usługę oddzielnie od nasłuchiwania komunikatów odnajdywania. Anons usługi może być również używany jako mechanizm rejestrowania usług za pomocą serwera proxy odnajdywania lub innych rejestrów usług. Poniższy kod pokazuje, jak skonfigurować usługę do wysyłania komunikatów anonsów za pośrednictwem powiązania UDP.
Uri baseAddress = new Uri($"http://{System.Net.Dns.GetHostName()}:8000/discovery/scenarios/calculatorservice/{Guid.NewGuid().ToString()}/");
// Create a ServiceHost for the CalculatorService type.
using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress))
{
// Add calculator endpoint
serviceHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), string.Empty);
// ** DISCOVERY ** //
// Make the service discoverable by adding the discovery behavior
ServiceDiscoveryBehavior discoveryBehavior = new ServiceDiscoveryBehavior();
serviceHost.Description.Behaviors.Add(discoveryBehavior);
// Send announcements on UDP multicast transport
discoveryBehavior.AnnouncementEndpoints.Add(
new UdpAnnouncementEndpoint());
// ** DISCOVERY ** //
// Add the discovery endpoint that specifies where to publish the services
serviceHost.Description.Endpoints.Add(new UdpDiscoveryEndpoint());
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("Press <ENTER> to terminate service.");
Console.ReadLine();
}
Odnajdywanie usług
Aplikacja kliencka może używać DiscoveryClient klasy do znajdowania usług. Deweloper tworzy wystąpienie DiscoveryClient klasy, która przechodzi w punkcie końcowym odnajdywania, który określa miejsce wysyłania Probe
lub Resolve
komunikatów. Następnie klient wywołuje Find kryteria wyszukiwania w ramach FindCriteria wystąpienia. Jeśli zostaną znalezione pasujące usługi, Find zwraca kolekcję .EndpointDiscoveryMetadata Poniższy kod pokazuje, jak wywołać metodę Find
, a następnie nawiązać połączenie z odnalezioną usługą.
class Client
{
static EndpointAddress serviceAddress;
static void Main()
{
if (FindService())
{
InvokeService();
}
}
// ** DISCOVERY ** //
static bool FindService()
{
Console.WriteLine("\nFinding Calculator Service ..");
DiscoveryClient discoveryClient =
new DiscoveryClient(new UdpDiscoveryEndpoint());
Collection<EndpointDiscoveryMetadata> calculatorServices =
(Collection<EndpointDiscoveryMetadata>)discoveryClient.Find(new FindCriteria(typeof(ICalculator))).Endpoints;
discoveryClient.Close();
if (calculatorServices.Count == 0)
{
Console.WriteLine("\nNo services are found.");
return false;
}
else
{
serviceAddress = calculatorServices[0].Address;
return true;
}
}
static void InvokeService()
{
Console.WriteLine("\nInvoking Calculator Service at {0}\n", serviceAddress);
// Create a client
CalculatorClient client = new CalculatorClient();
client.Endpoint.Address = serviceAddress;
client.Add(10,3);
}
}
Zabezpieczenia na poziomie odnajdywania i komunikatów
W przypadku korzystania z zabezpieczeń na poziomie komunikatów należy określić punkt EndpointIdentity końcowy odnajdywania usługi i dopasowanie EndpointIdentity w punkcie końcowym odnajdywania klienta. Aby uzyskać więcej informacji na temat zabezpieczeń na poziomie komunikatów, zobacz Zabezpieczenia komunikatów.
Odnajdywanie i usługi hostowane w Sieci Web
Aby usługi WCF mogły być wykrywalne, muszą być uruchomione. Usługi WCF hostowane w usługach IIS lub WAS nie są uruchamiane, dopóki usługi IIS/WAS nie odbierze komunikatu powiązanego z usługą, więc nie można ich odnaleźć domyślnie. Istnieją dwie opcje umożliwiające odnajdywanie usług hostowanych w Sieci Web:
Korzystanie z funkcji automatycznego uruchamiania aplikacji systemu Windows Server
Używanie serwera proxy odnajdywania do komunikowania się w imieniu usługi
Windows Server AppFabric ma funkcję automatycznego uruchamiania, która umożliwi uruchomienie usługi przed odebraniem komunikatów. W tym zestawie automatycznego uruchamiania można skonfigurować usługę hostowaną przez usługi IIS/WAS, aby można je było odnaleźć. Aby uzyskać więcej informacji na temat funkcji automatycznego uruchamiania, zobacz Funkcja automatycznego uruchamiania systemu Windows Server AppFabric. Oprócz włączenia funkcji Automatycznego uruchamiania należy skonfigurować usługę na potrzeby odnajdywania. Aby uzyskać więcej informacji, zobacz How to: Programmatically Add Discoverability to a WCF Service and Client Configuring Discovery in a Configuration File (Instrukcje: Programowe dodawanie możliwości odnajdywania do usługi WCF) i ClientConfiguring Discovery in a Configuration File (Konfigurowanie odnajdywania w pliku konfiguracji).
Serwer proxy odnajdywania może służyć do komunikowania się w imieniu usługi WCF, gdy usługa nie jest uruchomiona. Serwer proxy może nasłuchiwać sondy lub rozpoznawać komunikaty i odpowiadać na klienta. Klient może następnie wysyłać komunikaty bezpośrednio do usługi. Gdy klient wyśle komunikat do usługi, zostanie utworzone wystąpienie, aby odpowiedzieć na komunikat. Aby uzyskać więcej informacji na temat implementowania serwera proxy odnajdywania, zobacz Implementowanie serwera proxy odnajdywania.
Uwaga
Aby odnajdywanie WCF działało poprawnie, wszystkie karty sieciowe (kontroler interfejsu sieciowego) powinny mieć tylko 1 adres IP.