Freigeben über


WCF Discovery (Übersicht)

Die Discovery-APIs stellen ein einheitliches Programmiermodell für die dynamische Veröffentlichung und Ermittlung von Webdiensten mithilfe des WS-Discovery-Protokolls bereit. Diese APIs ermöglichen es Diensten, sich selbst und Clients zu veröffentlichen, um veröffentlichte Dienste zu finden. Sobald ein Dienst auffindbar gemacht wurde, kann der Dienst Ankündigungsnachrichten senden sowie auf Ermittlungsanfragen lauschen und darauf reagieren. Auffindbare Dienste können Hallo-Nachrichten senden, um ihre Ankunft in einem Netzwerk und Tschüss-Nachrichten, um ihre Abreise von einem Netzwerk anzukündigen. Um einen Dienst zu finden, senden Clients eine Probe Anforderung, die bestimmte Kriterien wie Servicevertragstyp, Schlüsselwörter und Bereich im Netzwerk enthält. Dienste erhalten die Probe Anforderung und bestimmen, ob sie den Kriterien entsprechen. Wenn ein Dienst übereinstimmt, antwortet er, indem eine ProbeMatch Nachricht zurück an den Client gesendet wird, die für die Kontaktaufnahme mit dem Dienst erforderlich ist. Clients können auch Resolve Anforderungen senden, die es ihnen ermöglichen, Dienste zu finden, deren Endpunktadresse möglicherweise geändert wurde. Übereinstimmende Dienste reagieren auf Resolve Anforderungen, indem sie eine ResolveMatch Nachricht zurück an den Client senden.

Ad-hoc-Modus und verwalteter Modus

Die Discovery-API unterstützt zwei verschiedene Modi: Verwaltet und Ad-hoc. Im verwalteten Modus gibt es einen zentralisierten Server namens Discoveryproxy, der Informationen zu verfügbaren Diensten verwaltet. Der Ermittlungsproxy kann auf vielfältige Weise mit Informationen zu Diensten aufgefüllt werden. Beispielsweise können Dienste Ankündigungsnachrichten während des Startvorgangs an den Discoveryproxy senden, oder der Proxy kann Daten aus einer Datenbank oder einer Konfigurationsdatei lesen, um zu bestimmen, welche Dienste verfügbar sind. Wie der Ermittlungsproxy aufgefüllt wird, liegt vollständig bei dem Entwickler. Clients verwenden den Suchproxy zum Abrufen von Informationen zu verfügbaren Diensten. Wenn ein Client nach einem Dienst sucht, sendet er eine Probe Nachricht an den Discoveryproxy, und der Proxy bestimmt, ob einer der Dienste, die er kennt, mit dem Dienst übereinstimmt, nach dem der Client sucht. Wenn Treffer gefunden werden, sendet der Discoveryproxy eine ProbeMatch Antwort an den Client zurück. Der Client kann den Dienst dann direkt über die vom Proxy zurückgegebenen Dienstinformationen kontaktieren. Das Schlüsselprinzip hinter dem verwalteten Modus besteht darin, dass die Ermittlungsanforderungen unicastweise an eine Autorität gesendet werden, dem Discoveryproxy. Das .NET Framework enthält wichtige Komponenten, mit denen Sie Ihren eigenen Proxy erstellen können. Clients und Dienste können den Proxy anhand mehrerer Methoden finden:

  • Der Proxy kann auf Ad-hoc-Nachrichten reagieren.

  • Der Proxy kann während des Startvorgangs eine Ankündigungsnachricht senden.

  • Clients und Dienste können geschrieben werden, um nach einem bestimmten bekannten Endpunkt zu suchen.

Im Ad-Hoc-Modus gibt es keinen zentralen Server. Alle Erkundungsmeldungen, wie Dienstankündigungen und Anforderungen von Clients, werden im Multicast-Verfahren gesendet. Standardmäßig enthält .NET Framework Unterstützung für ad-hoc-Ermittlung über das UDP-Protokoll. Wenn z. B. ein Dienst so konfiguriert ist, dass eine Hello-Ankündigung beim Start gesendet wird, sendet er sie über eine bekannte Multicastadresse mit dem UDP-Protokoll. Kunden müssen aktiv auf diese Ankündigungen lauschen und entsprechend verarbeiten. Wenn ein Client eine Probe Nachricht für einen Dienst sendet, wird er über das Netzwerk mithilfe eines Multicastprotokolls gesendet. Jeder Dienst, der die Anforderung empfängt, bestimmt, ob er den Kriterien in der Probe Nachricht entspricht, und antwortet direkt auf den Client mit einer ProbeMatch Nachricht, wenn der Dienst den in der Probe Nachricht angegebenen Kriterien entspricht.

Vorteile der Verwendung von WCF Discovery

Da WCF Discovery mithilfe des WS-Discovery-Protokolls implementiert wird, ist es auch mit anderen Clients, Diensten und Proxys kompatibel, die WS-Discovery implementieren. WCF Discovery basiert auf den vorhandenen WCF-APIs, wodurch Es einfacher ist, Ihren vorhandenen Diensten und Clients Ermittlungsfunktionen hinzuzufügen. Sie können die Auffindbarkeit von Diensten einfach über die Anwendungskonfigurationseinstellungen hinzufügen. Darüber hinaus unterstützt WCF Discovery auch die Verwendung des Discoveryprotokolls über andere Transporte wie Peer net, Benennungsüberlagerung und HTTP. WCF Discovery bietet Unterstützung für einen verwalteten Betriebsmodus, in dem ein Ermittlungsproxy verwendet wird. Dadurch kann der Netzwerkdatenverkehr reduziert werden, da Nachrichten direkt an den Discoveryproxy gesendet werden, anstatt Multicastnachrichten an das gesamte Netzwerk zu senden. WCF Discovery ermöglicht auch mehr Flexibilität beim Arbeiten mit Webdiensten. Sie können beispielsweise die Adresse eines Diensts ändern, ohne den Client oder den Dienst neu konfigurieren zu müssen. Wenn ein Client auf den Dienst zugreifen muss, kann er eine Probe Nachricht über eine Find Anforderung ausgeben und erwarten, dass der Dienst mit seiner aktuellen Adresse antwortet. WCF Discovery ermöglicht es einem Client, basierend auf verschiedenen Kriterien, einschließlich Vertragstypen, Bindungselementen, Namespace, Bereich und Schlüsselwörtern oder Versionsnummern, nach einem Dienst zu suchen. WCF Discovery ermöglicht die Laufzeit- und Entwurfszeitermittlung. Das Hinzufügen von Ermittlungen zu Ihrer Anwendung kann verwendet werden, um andere Szenarien wie Fehlertoleranz und automatische Konfiguration zu aktivieren.

Dienstveröffentlichung

Um einen Dienst erkennbar zu machen, müssen Sie dem Diensthost ein ServiceDiscoveryBehavior hinzufügen. Außerdem müssen Sie einen Suchendpunkt hinzufügen, um anzugeben, welche Komponenten auf Suchnachrichten überwacht werden sollen. Das folgende Codebeispiel zeigt, wie ein selbst gehosteter Dienst geändert werden kann, um ihn auffindbar zu machen.

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

Eine ServiceDiscoveryBehavior Instanz muss einer Dienstbeschreibung hinzugefügt werden, damit der Dienst auffindbar ist. Dem Diensthost muss eine DiscoveryEndpoint-Instanz hinzugefügt werden, um dem Dienst mitzuteilen, welche Komponenten auf Suchanforderungen überwacht werden sollen. In diesem Beispiel wird ein UdpDiscoveryEndpoint (von DiscoveryEndpoint abgeleitet) hinzugefügt, um anzugeben, dass der Dienst die Überwachung über den UDP-Multicasttransport durchführen soll. Dies UdpDiscoveryEndpoint wird für die Ad-Hoc-Ermittlung verwendet, da alle Nachrichten auf Multicast-Weise gesendet werden.

Ankündigung

Standardmäßig sendet die Dienstveröffentlichung keine Ankündigungsnachrichten. Der Dienst muss so konfiguriert sein, dass Ankündigungsnachrichten gesendet werden. Dadurch können Dienstwriter flexibler arbeiten, weil sie den Dienst getrennt von der Überwachung auf Suchnachrichten ankündigen können. Die Dienstankündigung kann auch als Mechanismus zum Registrieren von Diensten mit einem Discovery-Proxy oder anderen Dienstregistern verwendet werden. Der folgende Code zeigt, wie Sie einen Dienst so konfigurieren, dass Ankündigungsnachrichten über eine UDP-Bindung gesendet werden.

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

Dienstentdeckung

Eine Clientanwendung kann die DiscoveryClient Klasse verwenden, um Dienste zu finden. Der Entwickler erstellt eine Instanz der DiscoveryClient-Klasse, die einen Suchendpunkt übergibt. Der Suchendpunkt gibt an, wohin Probe- oder Resolve-Nachrichten gesendet werden sollen. Der Client ruft dann auf Find , die Suchkriterien innerhalb einer FindCriteria Instanz angibt. Wenn übereinstimmende Dienste gefunden werden, wird Find eine Sammlung von EndpointDiscoveryMetadata zurückgeben. Der folgende Code zeigt, wie die Find Methode aufgerufen und dann eine Verbindung mit einem ermittelten Dienst hergestellt wird.

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

Ermittlung und Sicherheit auf Nachrichtenebene

Beim Verwenden der Nachrichtenebenensicherheit müssen Sie auf dem Dienstsuchendpunkt ein EndpointIdentity-Objekt und auf dem Clientsuchendpunkt ein passendes EndpointIdentity-Objekt angeben. Weitere Informationen zur Sicherheit auf Nachrichtenebene finden Sie unter Message Security.

Suche und im Internet gehostete Dienste

Damit WCF-Dienste auffindbar sind, müssen sie im Betrieb sein. WCF-Dienste, die unter IIS oder WAS gehostet werden, werden erst ausgeführt, wenn IIS/WAS eine nachricht empfängt, die für den Dienst gebunden ist, sodass sie nicht standardmäßig erkannt werden können. Es gibt zwei Möglichkeiten, Web-Hosted Dienste auffindbar zu machen:

  1. Verwenden des Autostartfeatures für Windows Server AppFabric

  2. Verwenden eines Suchproxys zur Kommunikation im Namen des Diensts

Windows Server AppFabric verfügt über ein AutoStart-Feature, mit dem ein Dienst gestartet werden kann, bevor Nachrichten empfangen werden. Mit diesem AutoStart-Satz kann ein von IIS/WAS gehosteter Dienst so konfiguriert werden, dass er auffindbar ist. Weitere Informationen zum AutoStart-Feature finden Sie unter Windows Server AppFabric AutoStart Feature. Zusammen mit dem Aktivieren der Autostart-Funktion müssen Sie den Dienst für die Erkennung konfigurieren. Für weitere Informationen lesen Sie So fügen Sie programmiertechnisch die Auffindbarkeit zu einem WCF-Dienst und -Client hinzuKonfigurieren der Auffindbarkeit in einer Konfigurationsdatei.

Discovery-Proxies können verwendet werden, um Nachrichten im Auftrag des WCF-Diensts übermitteln zu können, wenn der Dienst nicht ausgeführt wird. Der Proxy kann Überprüfungs- oder Auflösungsmeldungen abhören und dem Client antworten. Der Client kann dann Nachrichten direkt an den Dienst senden. Wenn der Client eine Nachricht an den Dienst sendet, wird sie instanziiert, um auf die Nachricht zu antworten. Weitere Informationen zum Implementieren eines Discoveryproxys finden Sie unter Implementieren eines Discoveryproxys.

Hinweis

Damit WCF Discovery ordnungsgemäß funktioniert, sollten alle NICs (Netzwerkschnittstellencontroller) nur eine IP-Adresse haben.