Öğretici: Azure WCF Geçişi kullanarak şirket içi Windows Communication Foundation (WCF) REST hizmetini dış istemciye sunma
Bu öğreticide, Azure Relay kullanarak WCF Geçişi istemci uygulaması ve hizmet oluşturma adımları açıklanmaktadı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 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üm dizisini inceledikten sonra çalışan bir hizmetiniz olur. Ayrıca hizmetin işlemlerini çağırabilen bir istemciniz de olur.
Bu öğreticide aşağıdaki görevleri gerçekleştirin:
- 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:
- Azure aboneliği. Aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
- Visual Studio 2015 veya üzeri. Bu öğreticideki örneklerde Visual Studio 2019 kullanılır.
- .NET için Azure SDK. SDK indirmeleri sayfasından yükleyin.
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ı birleşimi, Azure'ın bir uygulamaya erişimin kimliğini doğrulamak için kimlik bilgilerini sağlar.
Azure Portal’ında oturum açın.
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.
Ad alanı oluştur sayfasında şu adımları izleyin:
Ad alanının oluşturulacağı bir Azure aboneliği seçin.
Kaynak grubu için, ad alanının yerleştirileceği mevcut bir kaynak grubunu seçin veya yeni bir tane oluşturun.
Geçiş ad alanı için bir ad girin.
Ad alanınızın barındırılacağı bölgeyi seçin.
Sayfanın alt kısmındaki Gözden geçir ve oluştur'u seçin.
Gözden Geçir + oluştur sayfasında Oluştur'u seçin.
Birkaç dakika sonra ad alanının Geçiş sayfasını görürsünüz.
Yönetim kimlik bilgilerini alma
Geçiş sayfasında, soldaki menüden Paylaşılan erişim ilkeleri'ni seçin.
Paylaşılan erişim ilkeleri sayfasında RootManageSharedAccessKey'i seçin.
SAS İlkesi: RootManageSharedAccessKey altında, Birincil Bağlantı Dizesi'nin yanındaki Kopyala düğmesini seçin. Bu eylem, bağlantı dizesi daha sonra kullanmak üzere panonuza kopyalar. Bu değeri Not Defteri veya başka bir geçici konuma yapıştırın.
Birincil anahtar değerini daha sonra kullanmak üzere kopyalayıp geçici bir konuma yapıştırarak önceki adımı tekrarlayın.
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 geniş bir tartışma için bkz . Hizmetleri Tasarlama ve Uygulama.
Arabirimle geçiş sözleşmesi oluşturma
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.
Visual Studio'da Yeni proje oluştur'u seçin.
Yeni proje oluştur bölümünde C# için Konsol Uygulaması (.NET Framework) seçeneğini belirleyin ve İleri'yi seçin.
Projeye EchoService adını verin ve Oluştur'u seçin.
Çözüm Gezgini'da projeye sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. NuGet Paket Yöneticisi 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.
Bu paket, Service Bus kitaplıklarına ve WCF'ye
System.ServiceModel
otomatik olarak başvuru 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.Program.cs en üstüne aşağıdaki
using
deyimleri ekleyin:using System.ServiceModel; using Microsoft.ServiceBus;
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.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ğerinehttps://samples.microsoft.com/ServiceModel/Relay/
sahip 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 öğreticide, hizmet sözleşmesi ad alanının adlandırma düzeni sürüm bilgilerini içermez.
Arabiriminde
IEchoContract
, sözleşmenin arabirimde kullanıma sunacağı tek işlemIEchoContract
için bir yöntem bildirin ve özniteliğini genel WCF Geçişi sözleşmesinin bir parçası olarak kullanıma açmak istediğiniz yönteme aşağıdaki gibi uygulayınOperationContractAttribute
:[OperationContract] string Echo(string text);
IEchoContract
arabirimi tanımından hemen sonra, aşağıda belirtildiği şekildeIEchoContract
veIClientChannel
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.
Derleme Çözümü Derle'yi>seçin 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, app.config yapılandırma dosyasını kullanarak arabirimi 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.
IEchoContract
arabiriminin tanımından hemen sonraEchoService
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.IEchoContract
arabirimine ServiceBehaviorAttribute özniteliğini uygulayın. Öznitelik, hizmet adını ve ad alanını belirtir. Bunu yaptıktan sonraEchoService
sınıfı şu şekilde görünür:[ServiceBehavior(Name = "EchoService", Namespace = "https://samples.microsoft.com/ServiceModel/Relay/")] class EchoService : IEchoContract { }
EchoService
sınıfındakiIEchoContract
arabiriminde tanımlananEcho
yöntemini uygulayın.public string Echo(string text) { Console.WriteLine("Echoing: {0}", text); return text; }
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'ün parçası olmayan bir NetTcpRelayBinding bağlamasına başvuruyor olmasıdır. NetTcpRelayBinding , hizmet tarafından tanımlanan bağlamalardan biridir.
Çözüm Gezgini app.config dosyasına çift tıklayarak dosyayı Visual Studio düzenleyicisinde açın.
öğ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.<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>
<services>
öğesi içinde, hizmetin adını tanımlamak için<service>
öğesi ekleyin.<service name="Microsoft.ServiceBus.Samples.EchoService"> </service>
<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.
Derleme Çözümü Derle'yi>seçin 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
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.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 düzeninin kısaltmasıdır. Protokol olarak TCP kullandığımızı gösterir. Bu düzen daha önce yapılandırma dosyasında NetTcpRelayBinding bağlama olarak belirtildiğinde de belirtilmişti.
Bu öğretici için URI şudur: sb://putServiceNamespaceHere.windows.net/EchoService
Hizmet ana bilgisayarını oluşturma ve yapılandırma
üzerinde
Main()
çalışmaya devam ediyor, bağlantı modunu olarakAutoDetect
ayarlayı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ı
AutoDetect
kullanarak hizmet, varsa TCP üzerinden Azure Relay'e ve 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 Geçişi ile iletişim kurmasını sağlayabilirConnectivityMode.AutoDetect
.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.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;
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
DiscoveryType
private
, bir istemci hizmete erişmeye devam edebilir. Ancak, hizmet ad alanında aramaRelay
yaparken görünmez. Bunun yerine, istemcinin uç nokta yolunu önceden bilmesi gerekir.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
Hala içinde
Main()
, hizmeti açmak için aşağıdaki satırı ekleyin.host.Open();
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();
Bu işlemi bitirdiğinizde, hizmet ana bilgisayarını kapatın.
host.Close();
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, öğreticideki önceki adımlardan 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.
İstemci için geçerli Visual Studio çözümünde yeni bir proje oluşturun:
- Çözüm Gezgini'da geçerli çözüme (projeye değil) sağ tıklayın ve Yeni Proje Ekle'yi>seçin.
- Yeni proje ekle bölümünde C# için Konsol Uygulaması (.NET Framework) öğesini ve ardından İleri'yi seçin.
- Projenin adı olarak EchoClient'ı belirtin ve Oluştur'u seçin.
Çözüm Gezgini EchoClient projesinde Program.cs çift tıklayarak dosyayı henüz açık değilse düzenleyicide açın.
EchoClient
olan varsayılan ad alanı adınıMicrosoft.ServiceBus.Samples
olarak değiştirin.Service Bus NuGet paketini yükleyin:
Çözüm Gezgini'da EchoClient'a sağ tıklayıp NuGet Paketlerini Yönet'i seçin.
Gözat'ı seçin, ardından WindowsAzure.ServiceBus'ı arayın ve seçin. Yükle'yi seçin ve kullanım koşullarını kabul edin.
Program.cs dosyasına System.ServiceModel ad alanı için bir
using
deyim ekleyin.using System.ServiceModel;
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 { }
İ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.
Çözüm Gezgini EchoClient projesinde App.config dosyasına çift tıklayarak dosyayı Visual Studio düzenleyicisinde açın.
<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.öğesinin içine
system.serviceModel
bir<client>
öğe ekleyin.<?xmlversion="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <client> </client> </system.serviceModel> </configuration>
Bu kod, WCF stilinde bir istemci uygulaması tanımladığınızı bildirir.
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ı gerçeğini 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.
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
Bağlantı modunu
AutoDetect
olarak ayarlayın. Aşağıdaki kodu EchoClient uygulamasınınMain()
yöntemine ekleyin.ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
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();
Relay projenizde konağın konumunu tanımlayan URI'yi oluşturun.
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "EchoService");
Hizmet ad alanı uç noktanız için kimlik bilgileri nesnesini oluşturun.
TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior(); sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);
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.
Kimlik bilgilerini uygulayın.
channelFactory.Endpoint.Behaviors.Add(sasCredential);
Kanalı oluşturup hizmet tarafından kullanılması için açın.
IEchoChannel channel = channelFactory.CreateChannel(); channel.Open();
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.
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
Çö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.
İstemci uygulamasını çalıştırmadan önce hizmet uygulamasının çalıştığından emin olmanız gerekir. Çözüm Gezgini EchoService çözümüne sağ tıklayın ve Özellikler'i seçin.
Özellik Sayfaları, Ortak Özellikler>Başlangıç Projesi'nde Birden çok başlangıç projesi'ni seçin. EchoService çözümünün liste başında olduğundan emin olun.
EchoService ve EchoClient projeleri için Eylem kutusunu Başlat olarak ayarlayın.
Proje Bağımlılıkları'na tıklayın. Projeler'de EchoClient'ı seçin. Bağımlı olarak EchoService'in seçili olduğundan emin olun.
Özellik Sayfaları'nın kapatılması için Tamam'ı seçin.
Her iki projenin de çalıştırılması için F5'i seçin.
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.
Ardından, konsol sas anahtarınızı ister. SAS anahtarını girin ve Enter tuşuna basın.
Konsol penceresinden örnek çıktı aşağıda verilmişti. 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
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.
Bu değerleri girdikten sonra, istemci hizmete bir kanal açar ve aşağıdaki konsol çıktı örneğinde görüldüğü gibi bir metin 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 örnek çıktıdır.Server echoed: My sample text
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ım
Şu öğreticiye ilerleyin: