Übersicht über die WCF-SucheWCF Discovery Overview

Die Such-APIs stellen ein einheitliches Programmiermodell zur dynamischen Veröffentlichung von und zum Suchen nach Webdiensten bereit, wobei das WS-Suchprotokoll verwendet wird.The Discovery APIs provide a unified programming model for the dynamic publication and discovery of Web services using the WS-Discovery protocol. Diese APIs ermöglichen es Diensten, sich selbst zu veröffentlichen, und Client das Suchen nach veröffentlichten Diensten.These APIs allow services to publish themselves and clients to find published services. Nachdem ein Dienst erkennbar gemacht wurde, kann der Dienst Ankündigungsmeldungen senden sowie eine Überwachung auf Suchanforderungen durchführen und darauf antworten.Once a service is made discoverable, the service has the ability to send announcement messages as well as listen for and respond to discovery requests. Erkennbare Dienste können Hello-Nachrichten senden, um ihre Ankunft in einem Netzwerk anzukündigen, und Bye-Nachrichten, um das Verlassen eines Netzwerks anzukündigen.Discoverable services can send Hello messages to announce their arrival on a network and Bye messages to announce their departure from a network. Um nach einem Dienst zu suchen, senden Clients eine Probe-Anforderung, die bestimmte Kriterien wie den Dienstvertragstyp, Schlüsselwörter und den Bereich des Netzwerks enthält.To find a service, clients send a Probe request that contains specific criteria such as service contract type, keywords, and scope on the network. Dienste empfangen die Probe-Anforderung und bestimmen, ob diese den Kriterien entspricht.Services receive the Probe request and determine whether they match the criteria. Wenn sich für einen Dienst eine Übereinstimmung ergibt, antwortet dieser mit dem Rücksenden einer ProbeMatch-Nachricht an den Client, in der die Informationen für die Kontaktaufnahme mit dem Dienst enthalten sind.If a service matches, it responds by sending a ProbeMatch message back to the client with the information necessary to contact the service. Clients können auch Resolve-Anforderungen senden, mit deren Hilfe sie nach Diensten suchen können, die ggf. ihre Endpunktadresse geändert haben.Clients can also send Resolve requests that allow them to find services that may have changed their endpoint address. Dienste, die Übereinstimmungen ergeben, antworten auf Resolve-Anforderungen, indem sie eine ResolveMatch-Nachricht zurück an den Client senden.Matching services respond to Resolve requests by sending a ResolveMatch message back to the client.

Ad-hoc-Modus und verwalteter ModusAd-Hoc and Managed Modes

Die Such-API unterstützt zwei verschiedene Modi: Verwaltet und Ad-hoc.The Discovery API supports two different modes: Managed and Ad-Hoc. Im Modus "Verwaltet" wird ein zentralisierter Server verwendet, der als Suchproxy bezeichnet wird und Informationen zu verfügbaren Diensten verwaltet.In Managed mode there is a centralized server called a discovery proxy that maintains information about available services. Der Suchproxy auf verschiedene Arten mit Informationen zu Diensten aufgefüllt werden.The discovery proxy can be populated with information about services in a variety of ways. Dienste können z. B. während des Starts Ankündigungsmeldungen an den Suchproxy senden, oder der Proxy kann Daten aus einer Datenbank oder einer Konfigurationsdatei lesen, um zu ermitteln, welche Dienste verfügbar sind.For example, services can send announcement messages during start up to the discovery proxy or the proxy may read data from a database or a configuration file to determine what services are available. Die Art und Weise, wie der Suchproxy aufgefüllt wird, hängt vollständig vom Entwickler ab.How the discovery proxy is populated is completely up to the developer. Clients verwenden den Suchproxy zum Abrufen von Informationen zu verfügbaren Diensten.Clients use the discovery proxy to retrieve information about available services. Wenn ein Client nach einem Dienst sucht, sendet er eine Probe-Nachricht an den Suchproxy, und der Proxy ermittelt dann, ob einer der bekannten Dienste mit dem Dienst übereinstimmt, nach dem der Client sucht.When a client searches for a service it sends a Probe message to the discovery proxy and the proxy determines whether any of the services it knows about match the service the client is searching for. Wenn Übereinstimmungen vorhanden sind, sendet der Suchproxy eine ProbeMatch-Antwort zurück an den Client.If there are matches the discovery proxy sends a ProbeMatch response back to the client. Der Client kann sich dann direkt an den Dienst wenden, indem er die vom Proxy zurückgegebenen Dienstinformationen verwendet.The client can then contact the service directly using the service information returned from the proxy. Das Hauptprinzip hinter dem Modus "Verwaltet" beruht darauf, dass die Suchanforderungen im Unicast-Format an eine Autorität, den Suchproxy, gesendet werden.The key principle behind Managed mode is that the discovery requests are sent in a unicast manner to one authority, the discovery proxy. .NET Framework enthält Hauptkomponenten, mit denen Sie einen eigenen Proxy erstellen können.The .NET Framework contains key components that allow you to build your own proxy. Es gibt für Clients und Dienste mehrere Methoden, nach dem Proxy zu suchen:Clients and services can locate the proxy by multiple methods:

  • Der Proxy kann auf Ad-hoc-Nachrichten reagieren.The proxy can respond to ad-hoc messages.

  • Der Proxy kann während des Startvorgangs eine Ankündigungsnachricht senden.The proxy can send an announcement message during start up.

  • Es können Clients und Dienste geschrieben werden, um nach einem bestimmten bekannten Endpunkt zu suchen.Clients and services can be written to look for a specific well-known endpoint.

Im Ad-hoc-Modus gibt es keinen zentralisierten Server.In Ad-Hoc mode, there is no centralized server. Alle Suchnachrichten, z. B. Dienstankündigungen und Clientanforderungen, werden im Multicast-Format gesendet.All discovery messages such as service announcements and client requests are sent in a multicast fashion. Standardmäßig enthält .NET Framework Unterstützung für die Ad-hoc-Suche über das UDP-Protokoll.By default the .NET Framework contains support for Ad-Hoc discovery over the UDP protocol. Wenn ein Dienst z. B. konfiguriert wird, um während des Startvorgangs eine Hello-Ankündigung zu senden, erfolgt das Senden über eine bekannte Multicastadresse und das UDP-Protokoll.For example, if a service is configured to send out a Hello announcement on start up, it sends it out over a well-known, multicast address using the UDP protocol. Clients müssen über eine aktive Überwachung auf diese Ankündigungen verfügen und diese entsprechend verarbeiten.Clients have to actively listen for these announcements and process them accordingly. Wenn ein Client eine Probe-Nachricht für einen Dienst sendet, wird diese mit einem Multicastprotokoll über das Netzwerk übertragen.When a client sends a Probe message for a service it is sent over the network using a multicast protocol. Jeder Dienst, der die Anforderung empfängt, ermittelt, ob diese mit den Kriterien der Probe-Nachricht übereinstimmt. Anschließend antwortet der jeweilige Dienst dem Client direkt mit einer ProbeMatch-Nachricht, falls sich für den Dienst eine Übereinstimmung mit den Kriterien ergibt, die in der Probe-Nachricht angegeben sind.Each service that receives the request determines whether it matches the criteria in the Probe message and responds directly to the client with a ProbeMatch message if the service matches the criteria specified in the Probe message.

Vorteile der WCF-SucheBenefits of Using WCF Discovery

Da die WCF-Suche mit dem WS-Discovery-Protokoll implementiert wird, besteht Interoperabilität mit anderen Clients, Diensten und Proxys, die WS-Discovery ebenfalls implementieren.Because WCF Discovery is implemented using the WS-Discovery protocol it is interoperable with other clients, services, and proxies that implement WS-Discovery as well. Die WCF-Suche basiert auf den vorhandenen WCF-APIs, sodass Sie den vorhandenen Diensten und den Clients auf einfache Weise Suchfunktionalität hinzufügen können.WCF Discovery is built upon the existing WCF APIs, which makes it easy to add Discovery functionality to your existing services and clients. Sie können die Auffindbarkeit von Diensten einfach über die Anwendungskonfigurationseinstellungen hinzufügen.Service discoverability can be easily added through the application configuration settings. Außerdem unterstützt die WCF-Suche die Verwendung des Suchprotokolls über andere Transporte wie Peernetzwerk, Namens-Overlay und HTTP.In addition, WCF Discovery also supports using the discovery protocol over other transports such as peer net, naming overlay, and HTTP. Die WCF-Suche unterstützt den Modus "Verwaltet", in dem ein Suchproxy verwendet wird.WCF Discovery provides support for a Managed mode of operation where a discovery proxy is used. So kann der Netzwerkverkehr reduziert werden, weil Nachrichten direkt an den Suchproxy gesendet werden, und es werden keine Multicastnachrichten an das gesamte Netzwerk gesendet.This can reduce network traffic as messages are sent directly to the discovery proxy instead of sending multicast messages to the entire network. Beim Arbeiten mit Webdiensten ermöglicht die WCF-Suche zudem mehr Flexibilität.WCF Discovery also allows for more flexibility when working with Web services. Sie können z. B. die Adresse eines Diensts ändern, ohne den Client oder den Dienst neu konfigurieren zu müssen.For example, you can change the address of a service without having to reconfigure the client or the service. Wenn ein Client auf den Dienst zugreifen muss, kann er über eine Probe-Anforderung eine Find-Nachricht ausgeben. Er erwartet dann, dass der Dienst mit seiner aktuellen Adresse antwortet.When a client must access the service it can issue a Probe message through a Find request and expect the service to respond with its current address. Mit der WCF-Suche kann ein Client anhand unterschiedlicher Kriterien, wie Vertragstypen, Bindungselemente, Namespace, Bereich und Schlüsselwörter oder Versionsnummern, nach einem Dienst suchen.WCF Discovery allows a client to search for a service based on different criteria including contract types, binding elements, namespace, scope, and keywords or version numbers. Die WCF-Suche ermöglicht die Suche zur Laufzeit und zur Entwurfszeit.WCF Discovery enables runtime and design time discovery. Das Hinzufügen der Suchfunktion zu einer Anwendung ermöglicht weitere Szenarien, z. B. Fehlertoleranz und automatische Konfiguration.Adding discovery to your application can be used to enable other scenarios such as fault tolerance and auto configuration.

DienstveröffentlichungService Publication

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.To make a service discoverable, a ServiceDiscoveryBehavior must be added to the service host and a discovery endpoint must be added to specify where to listen for discovery messages. Im folgenden Codebeispiel wird gezeigt, wie Sie einen selbst gehosteten Dienst ändern können, um diesen erkennbar zu machen.The following code example shows how a self-hosted service can be modified to make it discoverable.

Uri baseAddress = new Uri(string.Format("http://{0}:8000/discovery/scenarios/calculatorservice/{1}/",  
        System.Net.Dns.GetHostName(), 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();
}

Einer Dienstbeschreibung muss eine ServiceDiscoveryBehavior-Instanz hinzugefügt werden, damit der Dienst erkennbar ist.A ServiceDiscoveryBehavior instance must be added to a service description for the service to be discoverable. Dem Diensthost muss eine DiscoveryEndpoint-Instanz hinzugefügt werden, um dem Dienst mitzuteilen, welche Komponenten auf Suchanforderungen überwacht werden sollen.A DiscoveryEndpoint instance must be added to the service host to tell the service where to listen for discovery requests. 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.In this example, a UdpDiscoveryEndpoint (which is derived from DiscoveryEndpoint) is added to specify that the service should listen for discovery requests over the UDP multicast transport. Der UdpDiscoveryEndpoint wird für die Ad-hoc-Suche verwendet, weil alle Nachrichten im Multicast-Format gesendet werden.The UdpDiscoveryEndpoint is used for Ad-Hoc discovery because all messages are sent in a multicast fashion.

AnkündigungAnnouncement

Bei der Dienstveröffentlichung werden standardmäßig keine Ankündigungsnachrichten gesendet.By default, service publication does not send out announcement messages. Der Dienst muss so konfiguriert werden, dass er Ankündigungsnachrichten sendet.The service must be configured to send out announcement messages. Dadurch können Dienstwriter flexibler arbeiten, weil sie den Dienst getrennt von der Überwachung auf Suchnachrichten ankündigen können.This provides additional flexibility for service writers because they can announce the service separately from listening for discovery messages. Die Dienstankündigung kann auch als Mechanismus zum Registrieren von Diensten bei einem Suchproxy oder anderen Dienstregistrierungen verwendet werden.Service announcement can also be used as a mechanism for registering services with a discovery proxy or other service registries. Im folgenden Code wird gezeigt, wie Sie einen Dienst zum Senden von Ankündigungsnachrichten über eine UDP-Bindung konfigurieren.The following code shows how to configure a service to send announcement messages over a UDP binding.

Uri baseAddress = new Uri(string.Format("http://{0}:8000/discovery/scenarios/calculatorservice/{1}/",
        System.Net.Dns.GetHostName(), 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(new ServiceDiscoveryBehavior());

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

DienstsucheService Discovery

Eine Clientanwendung kann die DiscoveryClient-Klasse verwenden, um nach Diensten zu suchen.A client application can use the DiscoveryClient class to find services. Der Entwickler erstellt eine Instanz der DiscoveryClient-Klasse, die einen Suchendpunkt übergibt. Der Suchendpunkt gibt an, wohin Probe- oder Resolve-Nachrichten gesendet werden sollen.The developer creates an instance of the DiscoveryClient class that passes in a discovery endpoint that specifies where to send Probe or Resolve messages. Der Client ruft dann die Find-Methode auf, die die Suchkriterien innerhalb einer FindCriteria-Instanz angibt.The client then calls Find that specifies search criteria within a FindCriteria instance. Wenn übereinstimmende Dienste gefunden werden, gibt Find eine Auflistung von EndpointDiscoveryMetadata zurück.If matching services are found, Find returns a collection of EndpointDiscoveryMetadata. Der folgende Code zeigt, wie sie die Find-Methode aufrufen und dann eine Verbindung zu einem ermittelten Dienst herstellen.The following code shows how to call the Find method and then connect to a discovered service.

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

Sicherheit der Such- und NachrichtenebeneDiscovery and Message Level Security

Beim Verwenden der Nachrichtenebenensicherheit müssen Sie auf dem Dienstsuchendpunkt ein EndpointIdentity-Objekt und auf dem Clientsuchendpunkt ein passendes EndpointIdentity-Objekt angeben.When using message level security it is necessary to specify an EndpointIdentity on the service discovery endpoint and a matching EndpointIdentity on the client discovery endpoint. Weitere Informationen finden Sie unterFor more information aboutSicherheit auf Zeilenebene angezeigt wird, finden Sie unter Nachrichtensicherheit. message level security, see Message Security.

Suche und im Internet gehostete DiensteDiscovery and Web Hosted Services

Damit WCF-Dienste erkennbar sind, müssen sie derzeit ausgeführt werden.In order for WCF services to be discoverable they must be running. Unter IIS oder WAS gehostete WCF-Dienste werden erst ausgeführt, wenn IIS/WAS eine Meldung für den Dienst empfängt. Daher sind sie nicht standardmäßig erkennbar.WCF services hosted under IIS or WAS do not run until IIS/WAS receives a message bound for the service, so they cannot be discoverable by default. Es gibt zwei Möglichkeiten, im Internet gehostete Dienste als erkennbar festzulegen:There are two options for making Web-Hosted services discoverable:

  1. Verwenden der Autostart-Funktion von Windows Server AppFabricUse the Windows Server AppFabric Auto-Start feature

  2. Verwenden eines Suchproxys zur Kommunikation im Namen des DienstsUse a discovery proxy to communicate on behalf of the service

Windows Server AppFabric verfügt über eine Autostart-Funktion, mit der ein Dienst gestartet werden kann, bevor Meldungen empfangen werden.Windows Server AppFabric has an Auto-Start feature that will allow a service to be started before receiving any messages. Wenn die Autostart-Funktion festgelegt ist, kann ein von IIS/WAS gehosteter Dienst als erkennbar konfiguriert werden.With this Auto-Start set, an IIS/WAS hosted service can be configured to be discoverable. Weitere Informationen finden Sie unterFor more information aboutdie Autostart-Funktion finden Sie unter Autostart-Funktion von Windows Server AppFabric. the Auto-Start feature see, Windows Server AppFabric Auto-Start Feature. Wenn Sie die Autostart-Funktion aktivieren, müssen Sie den Dienst für die Suche konfigurieren.Along with turning on the Auto-Start feature, you must configure the service for discovery. Weitere Informationen finden Sie unterFor more information, seeWie: Programmgesteuertes Hinzufügen der Ermittelbarkeit zu einem WCF-Dienst und ClientKonfigurieren der Suche in einer Konfigurationsdatei. How to: Programmatically Add Discoverability to a WCF Service and ClientConfiguring Discovery in a Configuration File.

Ein Suchproxy kann verwendet werden, um im Namen des WCF-Diensts zu kommunizieren, wenn der Dienst nicht ausgeführt wird.A discovery proxy can be used to communicate on behalf of the WCF service when the service is not running. Der Proxy kann Überprüfungs- oder Auflösungsmeldungen abhören und dem Client antworten.The proxy can listen for probe or resolve messages and respond to the client. Anschließend kann der Client Meldungen direkt an den Dienst senden.The client can then send messages directly to the service. Wenn der Client eine Meldung an den Dienst sendet, wird dieser instanziiert, um auf die Meldung zu antworten.When the client sends a message to the service it will be instantiated to respond to the message. Weitere Informationen finden Sie unterFor more information aboutImplementieren eines suchproxys finden Sie unter Implementieren eines Suchproxys. implementing a discovery proxy see, Implementing a Discovery Proxy.

Hinweis

Für WCF-Suche ordnungsgemäß funktioniert sollten alle Netzwerkkarten (Network Interface Controller) nur 1-IP-Adresse sein.For WCF Discovery to work correctly, all NICs (Network Interface Controller) should only have 1 IP address.