Delen via


Overzicht van WCF-detectie

De Discovery-API's bieden een geïntegreerd programmeermodel voor de dynamische publicatie en detectie van webservices met behulp van het WS-Discovery-protocol. Met deze API's kunnen services zichzelf en clients publiceren om gepubliceerde services te vinden. Zodra een service detecteerbaar is, kan de service aankondigingsberichten verzenden en luisteren naar en reageren op detectieaanvragen. Detecteerbare services kunnen Hello-berichten verzenden om hun aankomst op een netwerk en bye-berichten aan te kondigen om hun vertrek van een netwerk aan te kondigen. Om een service te vinden, verzenden clients een Probe aanvraag die specifieke criteria bevat, zoals het type servicecontract, trefwoorden en het bereik op het netwerk. Services ontvangen de Probe aanvraag en bepalen of ze voldoen aan de criteria. Als een service overeenkomt, reageert deze door een ProbeMatch bericht terug te sturen naar de client met de informatie die nodig is om contact op te maken met de service. Clients kunnen ook aanvragen verzenden Resolve waarmee ze services kunnen vinden die hun eindpuntadres mogelijk hebben gewijzigd. Overeenkomende services reageren op Resolve aanvragen door een ResolveMatch bericht terug te sturen naar de client.

Ad-hoc- en beheerde modi

De Discovery-API ondersteunt twee verschillende modi: Beheerd en Ad-Hoc. In de beheerde modus bevindt zich een gecentraliseerde server genaamd een detectieproxy die informatie over beschikbare services onderhoudt. De detectieproxy kan op verschillende manieren worden gevuld met informatie over services. Services kunnen bijvoorbeeld aankondigingsberichten verzenden tijdens het opstarten naar de detectieproxy of de proxy kunnen gegevens lezen uit een database of een configuratiebestand om te bepalen welke services beschikbaar zijn. Hoe de detectieproxy wordt ingevuld, is volledig aan de ontwikkelaar. Clients gebruiken de detectieproxy om informatie over beschikbare services op te halen. Wanneer een client naar een service zoekt, wordt er een Probe bericht naar de detectieproxy verzonden en bepaalt de proxy of een van de services die de client kent, overeenkomt met de service die de client zoekt. Als er overeenkomsten zijn met de detectieproxy, wordt een ProbeMatch antwoord teruggestuurd naar de client. De client kan vervolgens rechtstreeks contact opnemen met de servicegegevens die zijn geretourneerd door de proxy. Het belangrijkste principe achter de beheerde modus is dat de detectieaanvragen op een unicast-manier worden verzonden naar één instantie, de detectieproxy. Het .NET Framework bevat belangrijke onderdelen waarmee u uw eigen proxy kunt bouwen. Clients en services kunnen de proxy op meerdere manieren vinden:

  • De proxy kan reageren op ad-hocberichten.

  • De proxy kan een aankondigingsbericht verzenden tijdens het opstarten.

  • Clients en services kunnen worden geschreven om te zoeken naar een specifiek bekend eindpunt.

In de ad-hocmodus is er geen gecentraliseerde server. Alle detectieberichten, zoals serviceaankondigingen en clientaanvragen, worden op multicast-wijze verzonden. Het .NET Framework bevat standaard ondersteuning voor ad-hocdetectie via het UDP-protocol. Als een service bijvoorbeeld is geconfigureerd voor het verzenden van een Hello-aankondiging bij het opstarten, wordt deze verzonden via een bekend multicast-adres met behulp van het UDP-protocol. Klanten moeten actief naar deze aankondigingen luisteren en ze dienovereenkomstig verwerken. Wanneer een client een Probe bericht verzendt voor een service, wordt het via het netwerk verzonden met behulp van een multicast-protocol. Elke service die de aanvraag ontvangt, bepaalt of deze voldoet aan de criteria in het Probe bericht en reageert rechtstreeks op de client met een ProbeMatch bericht als de service voldoet aan de criteria die in het Probe bericht zijn opgegeven.

Voordelen van het gebruik van WCF Discovery

Omdat WCF Discovery is geïmplementeerd met behulp van het WS-Discovery-protocol, is het ook compatibel met andere clients, services en proxy's die WS-Discovery implementeren. WCF Discovery is gebaseerd op de bestaande WCF-API's, waardoor detectiefunctionaliteit eenvoudig kan worden toegevoegd aan uw bestaande services en clients. Servicedetectie kan eenvoudig worden toegevoegd via de configuratie-instellingen van de toepassing. Daarnaast biedt WCF Discovery ook ondersteuning voor het gebruik van het detectieprotocol via andere transporten, zoals peer-net, naamgevingsoverlay en HTTP. WCF Discovery biedt ondersteuning voor een beheerde bewerkingsmodus waarin een detectieproxy wordt gebruikt. Dit kan het netwerkverkeer verminderen omdat berichten rechtstreeks naar de detectieproxy worden verzonden in plaats van multicast-berichten naar het hele netwerk te verzenden. WCF Discovery biedt ook meer flexibiliteit bij het werken met webservices. U kunt bijvoorbeeld het adres van een service wijzigen zonder dat u de client of de service opnieuw hoeft te configureren. Wanneer een client toegang moet krijgen tot de service, kan deze een Probe bericht verzenden via een Find aanvraag en verwachten dat de service reageert met het huidige adres. Met WCF Discovery kan een client zoeken naar een service op basis van verschillende criteria, waaronder contracttypen, bindingselementen, naamruimte, bereik en trefwoorden of versienummers. WCF Discovery maakt runtime- en ontwerptijddetectie mogelijk. Het toevoegen van detectie aan uw toepassing kan worden gebruikt om andere scenario's in te schakelen, zoals fouttolerantie en automatische configuratie.

Servicepublicatie

Als u een service detecteerbaar wilt maken, moet er een ServiceDiscoveryBehavior worden toegevoegd aan de servicehost en moet er een detectie-eindpunt worden toegevoegd om op te geven waar moet worden geluisterd naar detectieberichten. In het volgende codevoorbeeld ziet u hoe een zelf-hostende service kan worden gewijzigd om deze detecteerbaar te maken.

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

Een ServiceDiscoveryBehavior exemplaar moet worden toegevoegd aan een servicebeschrijving om de service te kunnen detecteren. Er moet een DiscoveryEndpoint exemplaar worden toegevoegd aan de servicehost om de service te laten weten waar moet worden geluisterd naar detectieaanvragen. In dit voorbeeld wordt een UdpDiscoveryEndpoint (die is afgeleid van DiscoveryEndpoint) toegevoegd om op te geven dat de service moet luisteren naar detectieaanvragen via het UDP multicast-transport. De UdpDiscoveryEndpoint wordt gebruikt voor ad-hocdetectie omdat alle berichten op multicast-wijze worden verzonden.

Aankondiging

Standaard verzendt servicepublicatie geen aankondigingsberichten. De service moet zijn geconfigureerd om aankondigingsberichten te verzenden. Dit biedt extra flexibiliteit voor serviceschrijvers, omdat ze de service afzonderlijk kunnen aankondigen van het luisteren naar detectieberichten. Serviceaankondiging kan ook worden gebruikt als mechanisme voor het registreren van services bij een detectieproxy of andere serviceregisters. De volgende code laat zien hoe u een service configureert voor het verzenden van aankondigingsberichten via een UDP-binding.

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

Servicedetectie

Een clienttoepassing kan de DiscoveryClient klasse gebruiken om services te vinden. De ontwikkelaar maakt een exemplaar van de DiscoveryClient klasse die wordt doorgegeven aan een detectie-eindpunt dat aangeeft waarheen moet worden verzonden of Resolve berichten worden verzondenProbe. De client roept Find vervolgens aan dat zoekcriteria binnen een FindCriteria exemplaar worden opgegeven. Als overeenkomende services worden gevonden, Find retourneert u een verzameling van EndpointDiscoveryMetadata. De volgende code laat zien hoe u de Find methode aanroept en vervolgens verbinding maakt met een gedetecteerde 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);  
    }
}  

Detectie- en berichtniveaubeveiliging

Wanneer u beveiliging op berichtniveau gebruikt, moet u een EndpointIdentity eindpunt voor servicedetectie en een overeenkomst EndpointIdentity opgeven op het eindpunt voor clientdetectie. Zie Berichtbeveiliging voor meer informatie over beveiliging op berichtniveau.

Detectie en gehoste webservices

Als u wilt dat WCF-services kunnen worden gedetecteerd, moeten ze worden uitgevoerd. WCF-services die worden gehost onder IIS of WAS, worden pas uitgevoerd als IIS/WAS een bericht voor de service ontvangt, zodat ze niet standaard kunnen worden gedetecteerd. Er zijn twee opties voor het detecteren van web-gehoste services:

  1. De functie Automatisch starten van Windows Server AppFabric gebruiken

  2. Een detectieproxy gebruiken om namens de service te communiceren

Windows Server AppFabric heeft een functie voor automatisch starten waarmee een service kan worden gestart voordat berichten worden ontvangen. Met deze set voor automatisch starten kan een IIS-/WAS-gehoste service worden geconfigureerd om detecteerbaar te zijn. Voor meer informatie over de functie Automatisch starten raadpleegt u de functie Windows Server AppFabric Auto-Start. Naast het inschakelen van de functie Automatisch starten moet u de service configureren voor detectie. Zie Voor meer informatie: Programmatisch detectie toevoegen aan een WCF-service en clientconfigureren detectie in een configuratiebestand.

Een detectieproxy kan worden gebruikt om namens de WCF-service te communiceren wanneer de service niet wordt uitgevoerd. De proxy kan luisteren naar tests of berichten oplossen en reageren op de client. De client kan vervolgens berichten rechtstreeks naar de service verzenden. Wanneer de client een bericht naar de service verzendt, wordt er een instantie gemaakt om op het bericht te reageren. Zie Een detectieproxy implementeren voor meer informatie over het implementeren van een detectieproxy.

Notitie

WcF-detectie werkt alleen correct als alle NIC's (netwerkinterfacecontroller) slechts 1 IP-adres hebben.