Öğretici: Azure WCF Geçişi kullanarak şirket içi WCF REST hizmetini dış istemciye sunma

Bu öğreticide, Azure Relay kullanarak WCF Geçişi istemci uygulamasının ve bir hizmetin nasıl derlediği açıklanır. Özgün WCF karşılıkları gibi hizmet de bir veya daha fazla uç noktayı kullanıma sunan bir yapıdır. Her uç nokta bir veya daha fazla hizmet işlemi sunar. Bir hizmetin uç noktası, hizmetin bulunabileceği bir adresi , bir istemcinin hizmetle iletişim kurması gereken bilgileri içeren bir bağlamayı ve hizmet tarafından istemcilerine sağlanan işlevselliği tanımlayan bir sözleşmeyi belirtir. WCF ile WCF Geçişi arasındaki temel fark, uç noktanın bilgisayarınızda yerel olarak değil bulutta kullanıma açık olmasıdır.

Bu öğreticideki bölümlerin sırasını inceledikten sonra çalışan bir hizmetiniz olur. Ayrıca hizmetin işlemlerini çağırabilen bir istemciniz de olacaktır.

Bu öğreticide aşağıdaki görevleri yerine getirin:

  • Bu öğretici için önkoşulları yükleyin.
  • Geçiş ad alanı oluşturun.
  • WCF hizmet sözleşmesi oluşturun.
  • WCF sözleşmesini uygulayın.
  • Geçiş hizmetine kaydolmak için WCF hizmetini barındırın ve çalıştırın.
  • Hizmet sözleşmesi için bir WCF istemcisi oluşturun.
  • WCF istemcisini yapılandırın.
  • WCF istemcisini uygulayın.
  • Uygulamaları çalıştırın.

Önkoşullar

Bu öğreticiyi tamamlamak için aşağıdaki önkoşulları karşılamanız gerekir:

Geçiş ad alanı oluşturma

İlk adım bir ad alanı oluşturmak ve Paylaşılan Erişim İmzası (SAS) anahtarı almaktır. Ad alanı, geçiş hizmeti aracılığıyla kullanıma sunulan her uygulama için bir uygulama sınırı sağlar. Hizmet ad alanı oluşturulduğunda sistem tarafından otomatik olarak bir SAS anahtarı oluşturulur. Hizmet ad alanı ve SAS anahtarının birleşimi, Azure'ın uygulamaya erişimin kimliğini doğrulamak için kimlik bilgilerini sağlar.

  1. Azure Portal’ında oturum açın.

  2. Soldaki menüden Tüm hizmetler'i seçin. Tümleştirme'yi seçin, Geçişler'i arayın, fareyi Geçişler'in üzerine getirin ve oluştur'u seçin.

    Geçişler -> Oluştur düğmesinin seçimini gösteren ekran görüntüsü.

  3. Ad alanı oluştur sayfasında şu adımları izleyin:

    1. Ad alanının oluşturulacağı bir Azure aboneliği seçin.

    2. Kaynak grubu için, ad alanının yerleştirileceği mevcut bir kaynak grubunu seçin veya yeni bir tane oluşturun.

    3. Geçiş ad alanı için bir ad girin.

    4. Ad alanınızın barındırılması gereken bölgeyi seçin.

    5. Sayfanın alt kısmındaki Gözden geçir ve oluştur'u seçin.

      Ad alanı oluştur sayfasını gösteren ekran görüntüsü.

    6. Gözden Geçir ve oluştur sayfasında Oluştur'u seçin.

    7. Birkaç dakika sonra ad alanının Geçiş sayfasını görürsünüz.

      Geçiş ad alanının giriş sayfasını gösteren ekran görüntüsü.

Yönetim kimlik bilgilerini alma

  1. Geçiş sayfasında, soldaki menüde Paylaşılan erişim ilkeleri'ni seçin. `

  2. Paylaşılan erişim ilkeleri sayfasında RootManageSharedAccessKey öğesini seçin.

  3. SAS İlkesi: RootManageSharedAccessKey altında Birincil Bağlantı Dizesi'nin yanındaki Kopyala düğmesini seçin. Bu eylem, bağlantı dizesini daha sonra kullanmak üzere panonuza kopyalar. Bu değeri Not Defteri veya başka bir geçici konuma yapıştırın.

  4. Birincil anahtar değerini daha sonra kullanmak üzere kopyalayıp geçici bir konuma yapıştırarak önceki adımı tekrarlayın.

    Geçiş ad alanı için bağlantı bilgilerini gösteren ekran görüntüsü.

WCF hizmet sözleşmesi tanımlama

Hizmet sözleşmesi, hizmetin hangi işlemleri desteklediğini belirtir. İşlemler web hizmeti yöntemleri veya işlevleridir. Sözleşmeler; C++, C# veya Visual Basic arabirimi tanımlamasıyla oluşturulur. Arabirimdeki her yöntem belirli bir hizmet işlemine karşılık gelir. Her arabirimde ServiceContractAttribute özniteliğinin ve her işlemde de OperationContractAttribute özniteliğinin uygulanmış olması gerekir. ServiceContractAttribute özniteliğine sahip bir arabirimdeki bir yöntem OperationContractAttribute özniteliğine sahip değilse, bu yöntem kullanıma sunulmaz. Bu görevlere ilişkin kod, aşağıdaki yordamın altındaki örnekte sağlanır. Sözleşmeler ve hizmetler hakkında daha fazla bilgi için bkz. Hizmetleri Tasarlama ve Uygulama.

Arabirimle geçiş sözleşmesi oluşturma

  1. Microsoft Visual Studio'yu yönetici olarak başlatın. Bunu yapmak için Visual Studio program simgesine sağ tıklayın ve Yönetici olarak çalıştır'ı seçin.

  2. Visual Studio'da Yeni proje oluştur'u seçin.

  3. Yeni proje oluştur bölümünde C# için Konsol Uygulaması (.NET Framework) seçeneğini belirleyin ve İleri'yi seçin.

  4. Projeye EchoService adını verin ve Oluştur'u seçin.

    Konsol uygulaması oluşturma

  5. Çözüm Gezgini'da projeye sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. NuGet Paket Yöneticisi'ndeGözat'ı seçin, ardından WindowsAzure.ServiceBus için arama yapın ve seçin. Yükle'yi seçin ve kullanım koşullarını kabul edin.

    Service Bus paketi

    Bu paket, Service Bus kitaplıklarına ve WCF'ye System.ServiceModelotomatik olarak başvurular ekler. System.ServiceModel, WCF'nin temel özelliklerine programlamayla erişmenizi sağlayan ad alanıdır. Service Bus, hizmet sözleşmelerini tanımlamak için WCF'nin birçok nesnesini ve özniteliklerini kullanır.

  6. Program.cs dosyasının en üstüne aşağıdaki using deyimleri ekleyin:

    using System.ServiceModel;
    using Microsoft.ServiceBus;
    
  7. EchoService olan varsayılan ad alanı adını Microsoft.ServiceBus.Samples olarak değiştirin.

    Önemli

    Bu öğreticide, WCF istemcisini yapılandırma bölümündeki yapılandırma dosyasında kullanılan sözleşme tabanlı yönetilen türün ad alanı olan C# Microsoft.ServiceBus.Samples ad alanı kullanılır. Bu örneği oluştururken istediğiniz ad alanını belirtebilirsiniz. Ancak, uygulama yapılandırma dosyasında sözleşmenin ve hizmetin ad alanlarını buna göre değiştirmediğiniz sürece öğretici çalışmaz. App.config dosyasında belirtilen ad alanı, C# dosyalarınızda belirtilen ad alanıyla aynı olmalıdır.

  8. Ad alanı bildiriminden Microsoft.ServiceBus.Samples hemen sonra, ancak ad alanı içinde adlı IEchoContract yeni bir arabirim tanımlayın ve özniteliğini ad alanı değeriyle https://samples.microsoft.com/ServiceModel/Relay/arabirime uygulayınServiceContractAttribute. Ad alanı bildiriminden sonra aşağıdaki kodu yapıştırın:

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
    }
    

    Kodunuzun kapsamında kullandığınız ad alanı ile ad alanı değeri farklılık gösterir. Ad alanı değeri bu sözleşme için benzersiz bir tanımlayıcı olarak kullanılır. Ad alanını açıkça belirlemek, varsayılan ad alanı değerinin sözleşme adına eklenmesini engeller.

    Not

    Genellikle, hizmet sözleşmesi ad alanı sürüm bilgilerini barındıran bir adlandırma şeması içerir. Sürüm bilgilerini hizmet sözleşmesi ad alanına dahil etmek, hizmetlerin yeni bir ad alanı içeren yeni bir hizmet sözleşmesi tanımlayarak ve bu sözleşmeyi yeni bir uç noktada kullanıma sunarak büyük değişiklikleri yalıtmalarına olanak sağlar. Bu şekilde, istemciler güncelleştirilmek zorunda kalmadan eski hizmet sözleşmesini kullanmaya devam edebilir. Sürüm bilgileri, bir tarihten veya bir derleme numarasından oluşabilir. Daha fazla bilgi için bkz. Hizmet Sürümü Oluşturma. Bu öğretici için, hizmet sözleşmesi ad alanının adlandırma şeması sürüm bilgilerini içermez.

  9. Arabiriminde IEchoContract , sözleşmenin IEchoContract arabirimde kullanıma sunacağı tek işlem için bir yöntem bildirin ve OperationContractAttribute özniteliğini genel WCF Geçişi sözleşmesinin bir parçası olarak kullanıma açmak istediğiniz yönteme uygulayın:

    [OperationContract]
    string Echo(string text);
    
  10. IEchoContract arabirimi tanımından hemen sonra, aşağıda belirtildiği şekilde IEchoContract ve IClientChannel arabirimlerinden devralma işlemini gerçekleştiren bir kanal bildirin:

    public interface IEchoChannel : IEchoContract, IClientChannel { }
    

    Kanal, ana bilgisayar ve istemcinin bilgileri birbirlerine göndermek için kullandıkları WCF nesnesidir. Daha sonra, iki uygulama arasında bilgi yankısı yapmak için kanala kod yazacaksınız.

  11. Derleme ÇözümüOluştur'a> tıklayın veya Ctrl+Shift+B tuşlarına basarak çalışmanızın şu ana kadarki doğruluğunu onaylayın.

WCF sözleşmesi örneği

Aşağıdaki kod, WCF Geçişi sözleşmesini tanımlayan temel bir arabirimi gösterir.

using System;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Oluşturulması tamamlandığına göre arabirimi uygulayabilirsiniz.

WCF sözleşmesini uygulama

Azure geçişi oluşturmak için önce bir arabirim kullanarak sözleşmeyi oluşturmanız gerekir. Arabirimi oluşturma hakkında daha fazla bilgi için önceki bölüme bakın. Sonraki yordam arabirimini uygular. Bu görev, kullanıcı tanımlı IEchoContract arabirimi uygulayan adlı EchoService bir sınıf oluşturmayı içerir. Arabirimi uyguladıktan sonra, arabirimi birApp.config yapılandırma dosyası kullanarak yapılandırabilirsiniz. Yapılandırma dosyası, uygulama için gerekli bilgileri içerir. Bu bilgiler hizmetin adını, sözleşmenin adını ve geçiş hizmetiyle iletişim kurmak için kullanılan protokol türünü içerir. Bu görevler için kullanılan kod, yordamı izleyen örnekte sağlanır. Hizmet sözleşmesi uygulama hakkında daha genel bir tartışma için bkz. Hizmet Sözleşmelerini Uygulama.

  1. IEchoContract arabiriminin tanımından hemen sonra EchoService adlı yeni bir sınıf oluşturun. EchoService sınıfı, IEchoContract arabirimini uygular.

    class EchoService : IEchoContract
    {
    }
    

    Diğer arabirim uygulamalarına benzer şekilde, tanımı farklı bir dosyada uygulayabilirsiniz. Ancak bu öğreticide uygulama, arabirim tanımı ve Main() yöntemiyle aynı dosyadadır.

  2. IEchoContract arabirimine ServiceBehaviorAttribute özniteliğini uygulayın. Öznitelik, hizmet adını ve ad alanını belirtir. Bunu yaptıktan sonra EchoService sınıfı şu şekilde görünür:

    [ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class EchoService : IEchoContract
    {
    }
    
  3. EchoService sınıfındaki IEchoContract arabiriminde tanımlanan Echo yöntemini uygulayın.

    public string Echo(string text)
    {
        Console.WriteLine("Echoing: {0}", text);
        return text;
    }
    
  4. Derleme ÇözümüOluştur'a> veya Ctrl+Shift+B tuşlarına basın.

Hizmet konağı için yapılandırmayı tanımlama

Yapılandırma dosyası WCF yapılandırma dosyasına benzer. Hizmet adını, uç noktayı ve bağlamayı içerir. Uç nokta, Azure Relay'in istemcilerin ve konakların birbirleriyle iletişim kurması için kullanıma açtığı konumdur. Bağlama, iletişim kurmak için kullanılan protokol türüdür. Temel fark, bu yapılandırılmış hizmet uç noktasının .NET Framework parçası olmayan bir NetTcpRelayBinding bağlamasına başvuruyor olmasıdır. NetTcpRelayBinding , hizmet tarafından tanımlanan bağlamalardan biridir.

  1. Çözüm Gezgini'daApp.config çift tıklayarak dosyayı Visual Studio düzenleyicisinde açın.

  2. öğesinde <appSettings> yer tutucuları Azure Relay ad alanınızın adıyla ve önceki bir adımda kopyaladığınız SAS anahtarıyla değiştirin.

  3. <system.serviceModel> etiketleri içinde, bir <services> öğesi ekleyin. Tek bir yapılandırma dosyasında birden çok geçiş uygulaması tanımlayabilirsiniz. Ancak bu öğreticide yalnızca bir adet tanımlanır.

    <?xmlversion="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <services>
    
        </services>
      </system.serviceModel>
    </configuration>
    
  4. <services> öğesi içinde, hizmetin adını tanımlamak için <service> öğesi ekleyin.

    <service name="Microsoft.ServiceBus.Samples.EchoService">
    </service>
    
  5. <service> öğesi içinde, uç nokta sözleşmesinin konumunu ve uç noktaya yönelik bağlama türünü tanımlayın.

    <endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding"/>
    

    Uç nokta, istemcinin ana bilgisayar uygulamasını nerede arayacağını tanımlar. Daha sonra öğretici, Azure Relay aracılığıyla konağı tamamen kullanıma sunan bir URI oluşturmak için bu adımı kullanır. Bağlama, geçiş hizmetiyle iletişim kurmak için protokol olarak TCP kullandığımızı bildirir.

  6. Derleme ÇözümüOluştur'a> tıklayın veya Ctrl+Shift+B tuşlarına basarak çalışmanızın şu ana kadarki doğruluğunu onaylayın.

Hizmet sözleşmesi uygulama örneği

Aşağıdaki kod, hizmet sözleşmesinin uygulamasını gösterir.

[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]

    class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }

Aşağıdaki kod, hizmet konağıyla ilişkili App.config dosyasının temel biçimini gösterir.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Microsoft.ServiceBus.Samples.EchoService">
        <endpoint contract="Microsoft.ServiceBus.Samples.IEchoContract" binding="netTcpRelayBinding" />
      </service>
    </services>
    <extensions>
      <bindingExtensions>
        <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

Geçiş hizmetine kaydolmak için WCF hizmetini barındırma ve çalıştırma

Bu adımda Azure Relay hizmetinin nasıl çalıştırıldığı açıklanır.

Geçiş kimlik bilgilerini oluşturma

  1. Main() içinde, konsol penceresinden okunan ad alanını ve SAS anahtarını depolayabileceğiniz iki değişken oluşturun.

    Console.Write("Your Service Namespace: ");
    string serviceNamespace = Console.ReadLine();
    Console.Write("Your SAS key: ");
    string sasKey = Console.ReadLine();
    

    SAS anahtarı daha sonra projenize erişmek için kullanılacaktır. Ad alanı, Hizmet URI'si oluşturmak için CreateServiceUri öğesine bir parametre olarak geçirilir.

  2. TransportClientEndpointBehavior nesnesi kullanarak, kimlik bilgisi türü olarak bir SAS anahtarı kullanacağınızı bildirin. Aşağıdaki kodu son adımda eklenen koddan hemen sonra ekleyin.

    TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
    sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
    

Hizmet için temel adres oluşturma

Önceki bölümde eklediğiniz koddan sonra hizmetin temel adresi için bir Uri örnek oluşturun. Bu URI; Service Bus şemasını, ad alanını ve hizmet arabiriminin yolunu belirtir.

Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

"sb" değeri Service Bus şemasının kısaltmasıdır. Protokol olarak TCP kullandığımızı gösterir. Bu düzen daha önce bağlama olarak NetTcpRelayBinding belirtildiğinde yapılandırma dosyasında da belirtilmişti.

Bu öğretici için URI şudur: sb://putServiceNamespaceHere.windows.net/EchoService

Hizmet ana bilgisayarını oluşturma ve yapılandırma

  1. üzerinde Main()çalışmaya devam ediyor, bağlantı modunu olarak AutoDetectayarlayın.

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
    

    Bağlantı modu, hizmetin geçiş hizmetiyle iletişim kurmak için kullandığı protokolü açıklar; HTTP veya TCP. Varsayılan ayarını AutoDetectkullanarak, hizmet varsa TCP üzerinden Azure Relay'e, TCP kullanılamıyorsa HTTP'ye bağlanmayı dener. Bu sonuç, hizmetin istemci iletişimi için belirttiği protokolden farklıdır. Bu protokol, kullanılan bağlamaya göre belirlenir. Örneğin bir hizmet, uç noktasının HTTP üzerinden istemcilerle iletişim kurduğunu belirten TemelHttpRelayBinding bağlamasını kullanabilir. Aynı hizmet, hizmetin TCP üzerinden Azure Relay ile iletişim kurmasını sağlayabilir ConnectivityMode.AutoDetect .

  2. Bu bölümün önceki kısımlarında oluşturduğunuz URI'yi kullanarak hizmet ana bilgisayarını oluşturun.

    ServiceHost host = new ServiceHost(typeof(EchoService), address);
    

    Hizmet ana bilgisayarı, hizmetin örneğini oluşturan WCF nesnesidir. Burada, oluşturmak istediğiniz hizmet türünü, bir EchoService türü ve ayrıca hizmeti kullanıma açmak istediğiniz adrese geçirirsiniz.

  3. Program.cs dosyasının en üstüne System.ServiceModel.Description ve Microsoft.ServiceBus.Description başvurularını ekleyin.

    using System.ServiceModel.Description;
    using Microsoft.ServiceBus.Description;
    
  4. Main() öğesine geri dönüp, genel erişimi etkinleştirmek için uç noktayı yapılandırın.

    IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
    

    Bu adım geçiş hizmetine, projenizin Atom akışını inceleyerek uygulamanızın genel olarak bulunabileceğini bildirir. olarak ayarlarsanız DiscoveryTypeprivate, bir istemci hizmete erişmeye devam edebilir. Ancak, hizmet ad alanında arama Relay yaparken görünmez. Bunun yerine, istemcinin uç nokta yolunu önceden bilmesi gerekir.

  5. Hizmet kimlik bilgilerini App.config dosyasında tanımlanan hizmet uç noktalarına uygulayın:

    foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
    {
        endpoint.Behaviors.Add(serviceRegistrySettings);
        endpoint.Behaviors.Add(sasCredential);
    }
    

    Daha önce belirtildiği gibi, yapılandırma dosyasında birden çok hizmet ve uç nokta bildirebilirdiniz. Birden çok hizmet ve uç nokta bildirirseniz bu kod yapılandırma dosyasına çapraz geçiş yapar ve kimlik bilgilerinin uygulanacağı tüm uç noktalara yönelik arama yapar. Bu öğretici için yapılandırma dosyasında yalnızca bir uç nokta vardır.

Hizmet ana bilgisayarını açma

  1. hala içinde Main(), hizmeti açmak için aşağıdaki satırı ekleyin.

    host.Open();
    
  2. Kullanıcıyı hizmetin çalıştığı konusunda bilgilendirin ve hizmetin nasıl kapatılacağını açıklayın.

    Console.WriteLine("Service address: " + address);
    Console.WriteLine("Press [Enter] to exit");
    Console.ReadLine();
    
  3. Bu işlemi bitirdiğinizde, hizmet ana bilgisayarını kapatın.

    host.Close();
    
  4. Projeyi oluşturmak için Ctrl+Shift+B tuşlarına basın.

Konsol uygulamasında bir hizmeti barındıran örnek

Tamamlanmış hizmet kodunuz aşağıdaki gibi görünmelidir. Kod, öğreticinin önceki adımlarından hizmet sözleşmesini ve uygulamasını içerir ve hizmeti bir konsol uygulamasında barındırıyor.

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Description;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { };

    [ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    class EchoService : IEchoContract
    {
        public string Echo(string text)
        {
            Console.WriteLine("Echoing: {0}", text);
            return text;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;         

            Console.Write("Your Service Namespace: ");
            string serviceNamespace = Console.ReadLine();
            Console.Write("Your SAS key: ");
            string sasKey = Console.ReadLine();

           // Create the credentials object for the endpoint.
            TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
            sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);

            // Create the service URI based on the service namespace.
            Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

            // Create the service host reading the configuration.
            ServiceHost host = new ServiceHost(typeof(EchoService), address);

            // Create the ServiceRegistrySettings behavior for the endpoint.
            IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);

            // Add the Relay credentials to all endpoints specified in configuration.
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                endpoint.Behaviors.Add(serviceRegistrySettings);
                endpoint.Behaviors.Add(sasCredential);
            }

            // Open the service.
            host.Open();

            Console.WriteLine("Service address: " + address);
            Console.WriteLine("Press [Enter] to exit");
            Console.ReadLine();

            // Close the service.
            host.Close();
        }
    }
}

Hizmet sözleşmesi için bir WCF istemcisi oluşturma

Sonraki görev bir istemci uygulaması oluşturmak ve daha sonra uygulayacağınız hizmet sözleşmesini tanımlamaktır. Bu adımlar hizmet oluşturmak için kullanılan adımlara benzer: sözleşme tanımlama, App.config dosyasını düzenleme, geçiş hizmetine bağlanmak için kimlik bilgilerini kullanma vb. Bu görevler için kullanılan kod, aşağıdaki yordamın altındaki örnekte sağlanır.

  1. İstemci için geçerli Visual Studio çözümünde yeni bir proje oluşturun:

    1. Çözüm Gezgini'da geçerli çözüme (projeye değil) sağ tıklayın veYeni Proje Ekle'yi> seçin.
    2. Yeni proje ekle bölümünde C# için Konsol Uygulaması (.NET Framework) seçeneğini belirleyin ve İleri'yi seçin.
    3. Projeyi EchoClient olarak adlandırıp Oluştur'u seçin.
  2. Çözüm Gezgini,EchoClient projesinde Program.cs dosyasına çift tıklayarak dosyayı henüz açık değilse düzenleyicide açın.

  3. EchoClient olan varsayılan ad alanı adını Microsoft.ServiceBus.Samples olarak değiştirin.

  4. Service Bus NuGet paketini yükleyin:

    1. Çözüm Gezgini'daEchoClient'a sağ tıklayıp NuGet Paketlerini Yönet'i seçin.

    2. Gözat'ı seçin, ardından WindowsAzure.ServiceBus araması yapın ve seçin. Yükle'yi seçin ve kullanım koşullarını kabul edin.

      Service Bus paketini yükleme

  5. Program.cs dosyasına System.ServiceModel ad alanı için bir using deyim ekleyin.

    using System.ServiceModel;
    
  6. Hizmet sözleşmesi tanımını ad alanına aşağıdaki örnekte gösterilen şekilde ekleyin. Bu tanım , Hizmet projesinde kullanılan tanım ile aynıdır. Bu kodu ad alanının en üstüne Microsoft.ServiceBus.Samples ekleyin.

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        string Echo(string text);
    }
    
    public interface IEchoChannel : IEchoContract, IClientChannel { }
    
  7. İstemciyi oluşturmak için Ctrl+Shift+B tuşlarına basın.

EchoClient projesi örneği

Aşağıdaki kod EchoClient projesindeki Program.cs dosyasının geçerli durumunu gösterir.

using System;
using Microsoft.ServiceBus;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{

    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        string Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }


    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

WCF istemcisini yapılandırma

Bu adımda, bu öğreticide daha önce oluşturulan hizmete erişen temel bir istemci uygulaması için bir App.config dosyası oluşturursunuz. Bu App.config dosyası uç noktanın sözleşmesini, bağlamasını ve adını tanımlar. Bu görevler için kullanılan kod, aşağıdaki yordamın altındaki örnekte sağlanır.

  1. Çözüm GezginiEchoClient projesinde App.config çift tıklayarak dosyayı Visual Studio düzenleyicisinde açın.

  2. <appSettings> öğesinde, yer tutucuları hizmet ad alanınızdaki adla ve önceki adımların birinde kopyaladığınız SAS anahtarı ile değiştirin.

  3. öğesinin system.serviceModel içine bir <client> öğe ekleyin.

    <?xmlversion="1.0" encoding="utf-8"?>
    <configuration>
      <system.serviceModel>
        <client>
        </client>
      </system.serviceModel>
    </configuration>
    

    Bu kod, WCF stili bir istemci uygulaması tanımladığınızı bildirir.

  4. client öğesi içinde adı, sözleşmeyi ve uç noktaya yönelik bağlama türünü tanımlayın.

    <endpoint name="RelayEndpoint"
                    contract="Microsoft.ServiceBus.Samples.IEchoContract"
                    binding="netTcpRelayBinding"/>
    

    Bu kod uç noktanın adını tanımlar. Ayrıca hizmette tanımlanan sözleşmeyi ve istemci uygulamasının Azure Relay ile iletişim kurmak için TCP kullanmasını tanımlar. Uç nokta adı, bir sonraki adımda bu uç nokta yapılandırmasını hizmet URI'si ile bağlamak için kullanılır.

  5. Dosya>Tümünü Kaydet'i seçin.

App.config dosyası örneği

Aşağıdaki kod Echo istemcisi için App.config dosyasını gösterir.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint name="RelayEndpoint"
                      contract="Microsoft.ServiceBus.Samples.IEchoContract"
                      binding="netTcpRelayBinding"/>
    </client>
    <extensions>
      <bindingExtensions>
        <add name="netTcpRelayBinding"
                    type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      </bindingExtensions>
    </extensions>
  </system.serviceModel>
</configuration>

WCF istemcisini uygulama

Bu bölümde, bu öğreticide daha önce oluşturduğunuz hizmete erişen temel bir istemci uygulaması uygulayacaksınız. Hizmete benzer şekilde istemci, Azure Relay'e erişmek için aynı işlemlerin çoğunu yapar:

  • Bağlantı modunu ayarlar.
  • Ana bilgisayar hizmetinin yer aldığı URI'yi oluşturur.
  • Güvenlik kimlik bilgilerini tanımlar.
  • Bağlantıya kimlik bilgilerini uygular.
  • Bağlantıyı açar.
  • Uygulamaya özgü görevleri gerçekleştirir.
  • Bağlantıyı kapatır.

Ancak temel farklardan biri, istemci uygulamasının geçiş hizmetine bağlanmak için bir kanal kullanmasıdır. Hizmet, ServiceHost çağrısı kullanır. Bu görevler için kullanılan kod, aşağıdaki yordamın altındaki örnekte sağlanır.

İstemci uygulaması uygulama

  1. Bağlantı modunu AutoDetect olarak ayarlayın. Aşağıdaki kodu EchoClient uygulamasının Main() yöntemine ekleyin.

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
    
  2. Konsoldan okunan hizmet ad alanı ve SAS anahtarına yönelik değerleri tutması için değişkenleri tanımlayın.

    Console.Write("Your Service Namespace: ");
    string serviceNamespace = Console.ReadLine();
    Console.Write("Your SAS Key: ");
    string sasKey = Console.ReadLine();
    
  3. Relay projenizde konağın konumunu tanımlayan URI'yi oluşturun.

    Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
    
  4. Hizmet ad alanı uç noktanız için kimlik bilgileri nesnesini oluşturun.

    TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
    sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
    
  5. App.config dosyasında açıklanan yapılandırmayı yükleyen kanal fabrikasını oluşturun.

    ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));
    

    Kanal fabrikası, hizmet ve istemcinin iletişim kurmak için kullandığı bir kanal oluşturan WCF nesnesidir.

  6. Kimlik bilgilerini uygulayın.

    channelFactory.Endpoint.Behaviors.Add(sasCredential);
    
  7. Kanalı oluşturup hizmet tarafından kullanılması için açın.

    IEchoChannel channel = channelFactory.CreateChannel();
    channel.Open();
    
  8. Yankı için işlevselliği ve temel kullanıcı arabirimini yazın.

    Console.WriteLine("Enter text to echo (or [Enter] to exit):");
    string input = Console.ReadLine();
    while (input != String.Empty)
    {
        try
        {
            Console.WriteLine("Server echoed: {0}", channel.Echo(input));
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
        input = Console.ReadLine();
    }
    

    Kod, hizmet için ara sunucu olarak kanal nesnesinin örneğini kullanır.

  9. Kanalı ve fabrikayı kapatın.

    channel.Close();
    channelFactory.Close();
    

Bu öğretici için örnek kod

Tamamlanmış kodunuz aşağıdaki gibi görünmelidir. Bu kod bir istemci uygulamasının nasıl oluşturulacağını, hizmetin işlemlerinin nasıl çağrılacağını ve işlem çağrısı tamamlandıktan sonra istemcinin nasıl kapatacağını gösterir.

using System;
using Microsoft.ServiceBus;
using System.ServiceModel;

namespace Microsoft.ServiceBus.Samples
{
    [ServiceContract(Name = "IEchoContract", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")]
    public interface IEchoContract
    {
        [OperationContract]
        String Echo(string text);
    }

    public interface IEchoChannel : IEchoContract, IClientChannel { }

    class Program
    {
        static void Main(string[] args)
        {
            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;


            Console.Write("Your Service Namespace: ");
            string serviceNamespace = Console.ReadLine();
            Console.Write("Your SAS Key: ");
            string sasKey = Console.ReadLine();



            Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");

            TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
            sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);

            ChannelFactory<IEchoChannel> channelFactory = new ChannelFactory<IEchoChannel>("RelayEndpoint", new EndpointAddress(serviceUri));

            channelFactory.Endpoint.Behaviors.Add(sasCredential);

            IEchoChannel channel = channelFactory.CreateChannel();
            channel.Open();

            Console.WriteLine("Enter text to echo (or [Enter] to exit):");
            string input = Console.ReadLine();
            while (input != String.Empty)
            {
                try
                {
                    Console.WriteLine("Server echoed: {0}", channel.Echo(input));
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: " + e.Message);
                }
                input = Console.ReadLine();
            }

            channel.Close();
            channelFactory.Close();

        }
    }
}

Uygulamaları çalıştırma

  1. Çözümü oluşturmak için Ctrl+Shift+B tuşlarına basın. Bu eylem hem istemci projesini hem de önceki adımlarda oluşturduğunuz hizmet projesini oluşturur.

  2. İstemci uygulamasını çalıştırmadan önce hizmet uygulamasının çalıştığından emin olmanız gerekir. Çözüm Gezgini'daEchoService çözümüne sağ tıklayarak Özellikler'i seçin.

  3. Özellik Sayfaları'ndaOrtak Özellikler>Başlangıç Projesi'ni ve ardından Birden çok başlangıç projesi'ni seçin. EchoService çözümünün liste başında olduğundan emin olun.

  4. EchoService ve EchoClient projeleri için Eylem kutusunu Başlat olarak ayarlayın.

    Proje özellik sayfaları

  5. Proje Bağımlılıkları'na tıklayın. Projeler'deEchoClient'ı seçin. Bağımlılar içinEchoService'in seçili olduğundan emin olun.

    Proje bağımlılıkları

  6. Özellik Sayfalarını kapatmak için Tamam'ı seçin.

  7. Her iki projenin de çalıştırılması için F5'i seçin.

  8. Her iki konsol penceresi de açılır ve sizden ad alanı adı ister. Hizmetin önce çalışması gerekir, bu nedenle EchoService konsol penceresinde ad alanını girin ve Enter tuşuna basın.

  9. Ardından, konsol sizden SAS anahtarınızı ister. SAS anahtarını girin ve Enter tuşuna basın.

    Konsol penceresinden alınan örnek çıktı aşağıda verilmiştir. Buradaki değerler yalnızca örneklerdir.

    Your Service Namespace: myNamespace

    Your SAS Key: <SAS key value>

    Hizmet uygulaması, aşağıdaki örnekte görüldüğü şekilde konsol penceresini dinlediği adrese yazdırır.

    Service address: sb://mynamespace.servicebus.windows.net/EchoService/

    Press [Enter] to exit

  10. EchoClient konsol penceresinde, az önce hizmet uygulaması için girdiğiniz bilgileri girin. İstemci uygulaması için aynı hizmet ad alanını ve SAS anahtarı değerlerini girin.

  11. Bu değerleri girdikten sonra istemci hizmete yönelik bir kanal açar ve aşağıdaki konsol çıktısı örneğinde görüldüğü şekilde bazı metinler girmenizi ister.

    Enter text to echo (or [Enter] to exit):

    Hizmet uygulamasına gönderilecek metni girin ve Enter tuşuna basın. Bu metin, Echo hizmet işlemi aracılığıyla hizmete gönderilir ve aşağıdaki örnek çıktıda görüldüğü şekilde hizmet konsol penceresinde görünür.

    Echoing: My sample text

    İstemci uygulaması, Echo işleminin dönüş değerini, diğer bir deyişle orijinal metni alır ve konsol penceresine yazdırır. Aşağıdaki metin, istemci konsolu penceresinden alınan örnek çıktıdır.

    Server echoed: My sample text

  12. Bu şekilde istemciden hizmete metin iletileri göndermeye devam edebilirsiniz. İşiniz bittiğinde, her iki uygulamayı da sonlandırmak için istemci ve hizmet konsolu pencerelerinde Enter'ı seçin.

Sonraki adımlar

Şu öğreticiye ilerleyin: