Aracılığıyla paylaş


WCF Keşif Genel Bakış

Bulma API'leri, WS-Discovery protokolünün kullanıldığı Web hizmetlerinin dinamik yayını ve keşfi için birleşik bir programlama modeli sağlar. Bu API'ler, hizmetlerin kendilerini yayımlamasına ve istemcilerin yayımlanan hizmetleri bulmasına olanak tanır. Bir hizmet bulunabilir hale getirildikten sonra, hizmet duyuru iletileri göndermenin yanı sıra bulma isteklerini dinleme ve yanıtlama özelliğine sahiptir. Bulunabilir hizmetler bir ağa gelişlerini duyurmak için Merhaba iletileri, ağdan ayrıldığını duyurmak için de Bye iletileri gönderebilir. Bir hizmeti bulmak için, istemciler ağdaki hizmet sözleşmesi türü, anahtar sözcükler ve kapsam gibi belirli ölçütleri içeren bir Probe istek gönderir. Hizmetler isteği alır Probe ve ölçütlere uygun olup olmadığını belirler. Bir hizmet eşleşirse, hizmete başvurmak için gereken bilgileri içeren bir ProbeMatch ileti göndererek yanıt verir. İstemciler, uç nokta adreslerini değiştirmiş olabilecek hizmetleri bulmalarına olanak sağlayan istekler de gönderebilir Resolve . Eşleşen hizmetler, istemciye Resolve bir ileti göndererek ResolveMatch isteklere yanıt verir.

Geçici ve Yönetilen Modlar

Bulma API'si iki farklı modu destekler: Yönetilen ve Geçici. Yönetilen modda, kullanılabilir hizmetler hakkında bilgi tutan bulma proxy'si olarak adlandırılan merkezi bir sunucu vardır. Bulma proxy'si çeşitli yollarla hizmetlerle ilgili bilgilerle doldurulabilir. Örneğin, hizmetler keşif ara sunucusuna başlarken duyuru iletileri gönderebilir veya ara sunucu, hangi hizmetlerin kullanılabilir olduğunu belirlemek için bir veritabanından veya yapılandırma dosyasından veri okuyabilir. Bulma proxy'sinin doldurulma şekli tamamen geliştiriciye bağlı. İstemciler, kullanılabilir hizmetler hakkında bilgi almak için bulma ara sunucusunu kullanır. bir istemci bir hizmeti ararken bulma proxy'sine bir Probe ileti gönderir ve ara sunucu, hakkında bildiği hizmetlerden herhangi birinin istemcinin aradığı hizmetle eşleşip eşleşmediğini belirler. Eşleşmeler varsa bulma proxy'si istemciye geri bir ProbeMatch yanıt gönderir. İstemci daha sonra proxy'den döndürülen hizmet bilgilerini kullanarak doğrudan hizmete başvurabilir. Yönetilen modun arkasındaki temel ilke, bulma isteklerinin tek noktaya yayın biçiminde tek bir yetkiliye, bulma proxy'sine gönderilmesidir. .NET Framework, kendi proxy'nizi oluşturmanıza olanak sağlayan temel bileşenleri içerir. İstemciler ve hizmetler ara sunucuyu birden çok yöntemle bulabilir:

  • Proxy geçici iletilere yanıt verebilir.

  • Proxy, başlatma sırasında bir duyuru iletisi gönderebilir.

  • belirli bir iyi bilinen uç noktayı aramak için istemciler ve hizmetler yazılabilir.

Geçici modda merkezi bir sunucu yoktur. Hizmet duyuruları ve istemci istekleri gibi tüm bulma iletileri çok noktaya yayın biçiminde gönderilir. Varsayılan olarak .NET Framework, UDP protokolü üzerinden Geçici bulma desteği içerir. Örneğin, bir hizmet başlangıçta Hello duyurusu gönderecek şekilde yapılandırılmışsa, UDP protokolunu kullanarak bunu iyi bilinen çok noktaya yayın adresi üzerinden gönderir. İstemcilerin bu duyuruları etkin bir şekilde dinlemesi ve uygun şekilde işlemesi gerekir. İstemci bir hizmet için ileti Probe gönderdiğinde, çok noktaya yayın protokolü kullanılarak ağ üzerinden gönderilir. İsteği alan her hizmet iletideki ölçütlerle eşleşip eşleşmediğini belirler ve hizmet iletide Probe belirtilen Probe ölçütlerle eşleşiyorsa doğrudan istemciye bir ProbeMatch iletiyle yanıt verir.

WCF Bulma Kullanmanın Avantajları

WCF Bulma, WS-Discovery protokolü kullanılarak uygulandığından, WS-Discovery'yi uygulayan diğer istemciler, hizmetler ve proxy'lerle birlikte çalışabilir. WCF Bulma, mevcut WCF API'leri üzerine kurulmuştur ve bu da mevcut hizmetlerinize ve istemcilerinize Bulma işlevselliği eklemeyi kolaylaştırır. Hizmet bulunabilirliği, uygulama yapılandırma ayarları aracılığıyla kolayca eklenebilir. Ayrıca WCF Bulma, eş ağı, adlandırma katmanı ve HTTP gibi diğer aktarımlar üzerinde bulma protokollerinin kullanılmasını da destekler. WCF Bulma, bulma ara sunucusunun kullanıldığı Yönetilen işlem modu için destek sağlar. Bu, iletilerin ağın tamamına çok noktaya yayın iletileri göndermek yerine doğrudan bulma ara sunucusuna gönderilmesiyle ağ trafiğini azaltabilir. WCF Bulma, Web hizmetleriyle çalışırken daha fazla esneklik sağlar. Örneğin, istemciyi veya hizmeti yeniden yapılandırmak zorunda kalmadan hizmetin adresini değiştirebilirsiniz. bir istemci hizmete erişmesi gerektiğinde, bir Find istek aracılığıyla bir Probe ileti verebilir ve hizmetin geçerli adresiyle yanıt vermesini bekler. WCF Bulma, istemcinin sözleşme türleri, bağlama öğeleri, ad alanı, kapsam ve anahtar sözcükler veya sürüm numaraları gibi farklı ölçütlere göre bir hizmet aramasına olanak tanır. WCF Bulma, çalışma zamanı ve tasarım zamanı bulmayı etkinleştirir. Hataya dayanıklılık ve otomatik yapılandırma gibi diğer senaryoları etkinleştirmek için uygulamanıza bulma eklemek kullanılabilir.

Hizmet Yayını

Bir hizmetin bulunabilir olmasını sağlamak için, ServiceDiscoveryBehavior hizmet konağına bir eklenmelidir ve bulma iletilerinin nerede dinleneceğini belirtmek için bir bulma uç noktası eklenmelidir. Aşağıdaki kod örneği, şirket içinde barındırılan bir hizmetin bulunabilir hale getirmek için nasıl değiştirilebileceğini gösterir.

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

ServiceDiscoveryBehavior Hizmetin bulunabilir olması için hizmet açıklamasına bir örnek eklenmelidir. DiscoveryEndpoint Hizmete bulma isteklerini nerede dinleyeceğinize ilişkin bilgi vermek için hizmet konağına bir örnek eklenmelidir. Bu örnekte, hizmetin UDP çok noktaya yayın aktarımı üzerinden bulma isteklerini dinlemesi gerektiğini belirtmek için bir UdpDiscoveryEndpoint ('den DiscoveryEndpointtüretilir) eklenir. UdpDiscoveryEndpoint Tüm iletiler çok noktaya yayın biçiminde gönderildiğinden Geçici bulma için kullanılır.

Duyuru

Varsayılan olarak, hizmet yayını duyuru iletileri göndermez. Hizmet, duyuru iletileri gönderecek şekilde yapılandırılmalıdır. Bu, hizmeti bulma iletilerini dinlemekten ayrı olarak duyurabilecekleri için hizmet yazarları için ek esneklik sağlar. Hizmet duyurusu, hizmetleri bulma ara sunucusuna veya diğer hizmet kayıt defterlerine kaydetmek için bir mekanizma olarak da kullanılabilir. Aşağıdaki kodda, udp bağlaması üzerinden duyuru iletileri göndermek için bir hizmetin nasıl yapılandırılır gösterilmektedir.

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

Hizmet Bulma

İstemci uygulaması, hizmetleri bulmak için sınıfını DiscoveryClient kullanabilir. Geliştirici, nereye gönderileceğine Probe veya Resolve iletilerin DiscoveryClient gönderileceği yeri belirten bir bulma uç noktasına geçen sınıfın bir örneğini oluşturur. ardından istemci, bir FindCriteria örnek içindeki arama ölçütlerini belirten çağrısında Find bulunur. Eşleşen hizmetler bulunursa, Find bir koleksiyonu EndpointDiscoveryMetadatadöndürür. Aşağıdaki kod, yöntemini çağırmayı Find ve sonra bulunan bir hizmete bağlanmayı gösterir.

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

Bulma ve İleti Düzeyi Güvenliği

İleti düzeyi güvenliği kullanılırken, hizmet bulma uç noktasında bir EndpointIdentity ve istemci bulma uç noktasında bir eşleşme EndpointIdentity belirtmek gerekir. İleti düzeyi güvenliği hakkında daha fazla bilgi için bkz . İleti Güvenliği.

Bulma ve Web'de Barındırılan Hizmetler

WCF hizmetlerinin bulunabilir olması için çalışıyor olmaları gerekir. IIS veya WAS altında barındırılan WCF hizmetleri, IIS/WAS hizmet için bağlı bir ileti alıncaya kadar çalışmaz, bu nedenle varsayılan olarak bulunamaz. Web'de Barındırılan hizmetleri bulunabilir hale getirmek için iki seçenek vardır:

  1. Windows Server AppFabric Auto-Start özelliğini kullanma

  2. Hizmet adına iletişim kurmak için bulma ara sunucusu kullanma

Windows Server AppFabric,herhangi bir ileti almadan önce hizmetin başlatılmasını sağlayacak bir Otomatik Başlangıç özelliğine sahiptir. Bu Otomatik Başlangıç kümesiyle, IIS/WAS barındırılan bir hizmet bulunabilir olacak şekilde yapılandırılabilir. Otomatik Başlangıç özelliği hakkında daha fazla bilgi için bkz . Windows Server AppFabric Auto-Start Özelliği. Otomatik Başlangıç özelliğini açmanın yanı sıra, hizmeti bulma için yapılandırmanız gerekir. Daha fazla bilgi için bkz. Nasıl yapılır: WcF Hizmetine Program Aracılığıyla Bulunabilirlik Ekleme ve Yapılandırma Dosyasında bulmayı İstemciYapılandırma.

Bulma ara sunucusu, hizmet çalışmadığında WCF hizmeti adına iletişim kurmak için kullanılabilir. Ara sunucu, yoklama dinleyebilir veya iletileri çözümleyebilir ve istemciyi yanıtlayabilir. İstemci daha sonra doğrudan hizmete ileti gönderebilir. İstemci hizmete bir ileti gönderdiğinde, iletiyi yanıtlamak için örneklenir. Bulma ara sunucusu uygulama hakkında daha fazla bilgi için bkz . Bulma Ara Sunucusu Uygulama.

Not

WCF Bulma'nın doğru çalışması için tüm NIC'lerin (Ağ Arabirim Denetleyicisi) yalnızca 1 IP adresine sahip olması gerekir.