Sdílet prostřednictvím


Přehled zjišťování WCF

Rozhraní API zjišťování poskytují jednotný programovací model pro dynamickou publikaci a zjišťování webových služeb pomocí protokolu WS-Discovery. Tato rozhraní API umožňují službám publikovat sami sebe a klienty, aby našli publikované služby. Jakmile je služba zjistitelná, může služba odesílat zprávy oznámení a také naslouchat žádostem o zjišťování a odpovídat na ně. Zjistitelné služby můžou posílat zprávy Hello, které oznamují jejich příchod do sítě a bye zprávy, které oznamují jejich odchod ze sítě. Klienti odesílají Probe požadavek, který obsahuje konkrétní kritéria, jako je typ kontraktu služby, klíčová slova a obor v síti. Služby obdrží Probe žádost a určí, jestli splňují kritéria. Pokud služba odpovídá, odpoví odesláním ProbeMatch zprávy zpět klientovi s informacemi potřebnými ke kontaktování služby. Klienti můžou také odesílat Resolve žádosti, které jim umožňují najít služby, které mohly změnit adresu koncového bodu. Odpovídající služby reagují na Resolve požadavky odesláním ResolveMatch zprávy zpět klientovi.

Ad hoc a spravované režimy

Rozhraní API zjišťování podporuje dva různé režimy: spravované a ad hoc. Ve spravovaném režimu je centralizovaný server označovaný jako proxy zjišťování, který uchovává informace o dostupných službách. Proxy zjišťování lze naplnit informacemi o službách různými způsoby. Služby můžou například během spuštění odesílat zprávy s oznámením na proxy zjišťování nebo proxy může číst data z databáze nebo konfiguračního souboru, aby bylo možné určit, které služby jsou k dispozici. Jak se proxy zjišťování naplní, je zcela na vývojáři. Klienti používají proxy zjišťování k načtení informací o dostupných službách. Když klient vyhledá službu, odešle Probe zprávu proxy zjišťování a proxy určí, jestli některá ze služeb, které zná, odpovídá službě, kterou klient hledá. Pokud se shoduje s proxy zjišťováním ProbeMatch , odešle klientovi odpověď zpět. Klient pak může kontaktovat službu přímo pomocí informací o službě vrácených z proxy serveru. Klíčovým principem spravovaného režimu je, že požadavky na zjišťování se odesílají jednosměrovým způsobem jedné autoritě, proxy zjišťování. Rozhraní .NET Framework obsahuje klíčové komponenty, které umožňují sestavit vlastní proxy server. Klienti a služby mohou proxy server vyhledat několika metodami:

  • Proxy může reagovat na ad hoc zprávy.

  • Proxy server může během spuštění odeslat zprávu s oznámením.

  • Klienti a služby je možné zapsat tak, aby hledali konkrétní dobře známý koncový bod.

V režimu Ad-Hoc neexistuje žádný centralizovaný server. Všechny zprávy zjišťování, jako jsou oznámení služby a požadavky klientů, se odesílají vícesměrovým způsobem. Ve výchozím nastavení rozhraní .NET Framework obsahuje podporu ad hoc zjišťování přes protokol UDP. Pokud je například služba nakonfigurovaná tak, aby při spuštění odeslala oznámení Hello, odešle ji přes známou adresu vícesměrového vysílání pomocí protokolu UDP. Klienti musí aktivně naslouchat těmto oznámením a odpovídajícím způsobem je zpracovat. Když klient odešle Probe zprávu pro službu, odešle se přes síť pomocí protokolu vícesměrového vysílání. Každá služba, která obdrží požadavek, určuje, jestli odpovídá kritériím ve Probe zprávě, a odpoví přímo klientovi zprávou ProbeMatch , pokud služba odpovídá kritériím zadaným ve Probe zprávě.

Výhody používání zjišťování WCF

Vzhledem k tomu, že je zjišťování WCF implementováno pomocí protokolu WS-Discovery, je interoperabilní s ostatními klienty, službami a proxy servery, které také implementují WS-Discovery. Zjišťování WCF je postavené na existujících rozhraních API WCF, což usnadňuje přidávání funkcí zjišťování do stávajících služeb a klientů. Zjistitelnost služeb je možné snadno přidat prostřednictvím nastavení konfigurace aplikace. Kromě toho wcf Discovery také podporuje použití protokolu zjišťování přes jiné přenosy, jako jsou peer net, překrytí názvů a HTTP. Zjišťování WCF poskytuje podporu spravovaného režimu operace, kde se používá proxy zjišťování. To může snížit síťový provoz, protože zprávy se odesílají přímo na proxy zjišťování místo odesílání zpráv vícesměrového vysílání do celé sítě. Zjišťování WCF také umožňuje větší flexibilitu při práci s webovými službami. Můžete například změnit adresu služby, aniž byste museli překonfigurovat klienta nebo službu. Když klient musí získat přístup ke službě, může vydat Probe zprávu prostřednictvím Find požadavku a očekávat, že služba odpoví jeho aktuální adresou. Zjišťování WCF umožňuje klientovi vyhledat službu na základě různých kritérií, včetně typů kontraktů, vazeb prvků, oboru názvů, oboru názvů a klíčových slov nebo čísel verzí. Zjišťování WCF umožňuje zjišťování doby běhu a návrhu. Přidáním zjišťování do aplikace můžete povolit jiné scénáře, jako je odolnost proti chybám a automatická konfigurace.

Publikování služeb

Aby bylo možné službu zjistit, ServiceDiscoveryBehavior musí být přidána do hostitele služby a koncový bod zjišťování musí být přidán, aby bylo možné určit, kam se mají naslouchat zprávě zjišťování. Následující příklad kódu ukazuje, jak je možné upravit službu v místním prostředí, aby byla zjistitelná.

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 služba byla zjistitelná, musí být instance přidána do popisu služby. Instance DiscoveryEndpoint musí být přidána do hostitele služby, aby službě řekla, kde má naslouchat požadavkům zjišťování. V tomto příkladu je přidána UdpDiscoveryEndpoint položka (která je odvozena) DiscoveryEndpointk určení, že služba by měla naslouchat požadavkům zjišťování přes přenos vícesměrového vysílání UDP. Slouží UdpDiscoveryEndpoint ke zjišťování ad hoc, protože všechny zprávy se odesílají vícesměrovým způsobem.

Oznámení

Ve výchozím nastavení publikace služby neodesílá zprávy s oznámením. Služba musí být nakonfigurovaná tak, aby odesílala zprávy s oznámením. To poskytuje další flexibilitu pro zapisovače služeb, protože mohou službu oznamovat odděleně od naslouchání zpráv zjišťování. Oznámení služby lze také použít jako mechanismus pro registraci služeb pomocí proxy zjišťování nebo jiných registrů služeb. Následující kód ukazuje, jak nakonfigurovat službu tak, aby odesílala zprávy oznámení přes vazbu 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();
}

Zjišťování služeb

Klientská aplikace může třídu použít DiscoveryClient k vyhledání služeb. Vývojář vytvoří instanci DiscoveryClient třídy, která předává koncový bod zjišťování, který určuje, kam se mají odesílat Probe zprávy.Resolve Klient pak zavolá Find , která určuje kritéria hledání v instanci FindCriteria . Pokud jsou nalezeny odpovídající služby, Find vrátí kolekci EndpointDiscoveryMetadata. Následující kód ukazuje, jak volat metodu Find a pak se připojit ke zjištěné službě.

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

Zabezpečení na úrovni zjišťování a zpráv

Při použití zabezpečení na úrovni zpráv je nutné zadat koncový EndpointIdentity bod zjišťování služby a odpovídající EndpointIdentity koncový bod zjišťování klienta. Další informace o zabezpečení na úrovni zpráv naleznete v tématu Zabezpečení zpráv.

Zjišťování a služby hostované na webu

Aby mohly být služby WCF zjistitelné, musí být spuštěné. Služby WCF hostované ve službě IIS nebo WAS neběží, dokud služba IIS/WAS neobdrží zprávu s vazbou na službu, takže ve výchozím nastavení nelze zjistit. Pro zjišťování služeb hostovaných webem existují dvě možnosti:

  1. Použití funkce Automatické spuštění technologie Windows Server AppFabric

  2. Použití proxy zjišťování ke komunikaci jménem služby

Windows Server AppFabric má funkci Automatické spuštění, která umožní spuštění služby před příjmem jakýchkoli zpráv. Pomocí této sady automatického spuštění je možné nakonfigurovat službu hostovanou službou IIS/WAS tak, aby byla zjistitelná. Další informace o funkci Automatické spuštění naleznete v tématu Funkce Automatické spuštění technologie Windows Server AppFabric. Spolu se zapnutím funkce Automatické spuštění musíte službu nakonfigurovat pro zjišťování. Další informace naleznete v tématu Postupy: Programové přidání zjistitelnosti do služby WCF a klientakonfigurace zjišťování v konfiguračním souboru.

Proxy zjišťování lze použít ke komunikaci jménem služby WCF, pokud služba není spuštěná. Proxy server může naslouchat sondě nebo překládat zprávy a odpovídat na klienta. Klient pak může odesílat zprávy přímo do služby. Když klient odešle zprávu do služby, vytvoří se instance pro odpověď na zprávu. Další informace o implementaci proxy zjišťování naleznete v tématu Implementace proxy zjišťování.

Poznámka:

Aby zjišťování WCF fungovalo správně, měly by mít všechny síťové karty (síťový adaptér) jenom 1 IP adresu.