https://buraksenyurt.com/Burak Selim Şenyurt - Windows Azure2009-11-20T06:44:39+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://buraksenyurt.com/post/MicrosoftNet-Services-Service-Bus-icin-REST-Tabanli-Hello-WorldMicrosoft.Net Services - Service Bus için REST Tabanlı Hello World2009-11-19T23:45:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Bir önceki <a title="Microsoft.Net Services - Service Bus için Hello World" href="https://buraksenyurt.com/post/Microsoft-DotNet-Services-Service-Bus-Hello-World" target="_blank">yazımızda </a><strong>Microsoft.Net Services</strong> alt yapsının önemli parçalarından birisi olan <strong>Service Bus</strong> hizmetini incelemeye çalışmış ve basit bir <strong>Hello World</strong> uygulama koleksiyonu geliştirmiştik. Bu yazımızda ise <strong>REST</strong> bazlı geliştirilen bir <strong>WCF</strong> servisine herhangibir tarayıcı yardımıyla <strong>HTTP Get</strong> metoduna göre, <strong>Service Bus</strong> üzerinden nasıl ulaşabileceğimizi incelemeye çalışacağız.</p>
<p><strong>REST </strong>bazlı modelde bilindiği üzere Web tabanlı olarak yayınlanan servislere <strong>HTTP</strong> protokolünün <strong>Get,Post,Put,Delete </strong>gibi metodları yardımıyla erişilebilmektedir. Bu <strong>URL</strong> bazlı erişim sayesinde herhangibir tarayıcı uygulamanın söz konusu servis operasyonlarını kullanabilmesi mümkündür. Üstelik istemciler arada bir <strong>proxy</strong> nesnesine ihtiyaç duymadan doğrudan <strong>HTTP</strong> taleplerini gönderebilir. Bunlara ek olarak birde servis operasyonlarının <strong>Syndication(RSS,Atom gibi)</strong> tabanlı içerik yayınlayabilme kabiliyetleri eklendiğinde Web programlama modeline uygun bir hizmet üretiminin gerçekleştirilebildiği gözlemlenecektir.</p>
<p><strong>WCF</strong> mimarisi, <strong>.Net Framework 3.5 </strong>sürümünden bu yana Web programlama modelini desteklemektedir. Bu nedenle <strong>REST(Representational State Transfer)</strong> bazlı <strong>WCF </strong>servisleri kolayca geliştirilebilir. Bizde bu günkü örneğimizde sunucu tarafında, <strong>RSS 2.0 </strong>formatında içerik yayınlaması yapan ve <strong>REST</strong> tabanlı olarak çalışabilen bir <strong>WCF</strong> servisini geliştirecek ve buna olan istemci erişimleri için <strong>Service Bus'</strong> tan yararlanacağız. Tahmin edeceğiniz üzere <strong>Microsoft.Net Services</strong> üzerinde örneğimiz için bir<strong> Service Namespace'</strong> i oluşturulması gerekmektedir. Ben bu günkü örneğimiz için günlük öneri yemek listesini sunacak bir hizmete uygun aşağıdaki isimlendirmeyi kullanmayı tercih ettim.</p>
<p><img src="/pics/2009%2f11%2fblg98_ServiceNamespace.gif" alt="" /></p>
<p>Bundan sonraki ilk adımımız servis uygulamasını geliştirmek olacaktır. Söz konusu uygulama <strong>WCF Web programlama</strong> <strong>modelini(Web Programming Model)</strong> kullanacağından ve <strong>Service Bus</strong> üzerinden iletişimi sağlayacağından aşağıdaki şekilde görülen <strong>Microsoft.ServiceBus, System.ServiceModel.Web</strong> ve <strong>System.ServiceModel</strong> <strong>assembly</strong>' larını referans etmelidir.</p>
<p><img src="/pics/2009%2f11%2fblg98_References.gif" alt="" /></p>
<p>Gelelim sunucu uygulama tarafındaki kodlarımıza;</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Syndication;
using System.ServiceModel.Web;
using Microsoft.ServiceBus;
namespace ServerApp
{
// Servis sözleşmesi
[ServiceContract(Namespace = "http://www.buraksenyurt.com/MyFoodCompany")]
public interface IDailyFoodListContract
{
[OperationContract]
[WebGet] // Http Get taleplerine cevap verecek bir operasyon olduğunu belirtiyoruz
Rss20FeedFormatter GetDailyFoodList(string Day);
}
// Servisi uygulayan tip
[ServiceBehavior(Name = "DailyFoodListService", Namespace = "http://www.buraksenyurt.com/MyFoodCompany")]
public class DailyFoodListService
:IDailyFoodListContract
{
#region IDailyFoodListContract Members
// GetDailyFoodList metodu RSS 2.0 Formatında basit bir Syndication içeriği döndürmektedir.
public Rss20FeedFormatter GetDailyFoodList(string Day)
{
// Öncelikli olarak Feed oluşturulur
SyndicationFeed foodFeed = new SyndicationFeed();
foodFeed.Id=String.Format("Day_{0}",Day);
foodFeed.Title = new TextSyndicationContent("Günlük Yemek Listesi");
// Feed içerisindeki Item listesi hazırlanır
List<SyndicationItem> foodItems = new List<SyndicationItem>();
foodItems.Add(new SyndicationItem( "Aperatifler","Patlıcanlı Musakka", new Uri("http://myfoodcompany/Food/Musakka"), "10001", DateTime.Now));
foodItems.Add(new SyndicationItem("Çorbalar", "Mercimek Çorbası", new Uri("http://myfoodcompany/Food/MercimekCorba"), "12034", DateTime.Now));
foodItems.Add(new SyndicationItem("Ana Yemekler", "Mozeralla Peynirli Makarna", new Uri("http://myfoodcompany/Food/MakarnaMozeralla"), "10025", DateTime.Now));
// Item listesi feed' e eklenir.
foodFeed.Items=foodItems;
// RSS 2.0 formatındaki Feed içeriği üretimi için SyndicationFeed nesne örneği Rss20FeedFormatter sınıfının yapıcı metoduna parametre olarak geçirilir.
return new Rss20FeedFormatter(foodFeed);
}
#endregion
}
//// Kanal arayüzü
//public interface IDailyFoodListChannel
// : IDailyFoodListContract, IClientChannel
//{
//}
class Program
{
static void Main(string[] args)
{
Uri address = ServiceBusEnvironment.CreateServiceUri("https", "MyFoodCompany", "Foods");
// REST bazlı bir WCF Servisi host işlemi gerçekleştirileceğinden WebServiceHost nesne örneğinden yararlanılır
WebServiceHost host = new WebServiceHost(typeof(DailyFoodListService), address);
host.Open(); // Servis açılır
Console.WriteLine("Servis açıldı. Servis durumu {0}\nService Adresi {1}", host.State,address.ToString());
Console.WriteLine("Operasyon Adı : GetDailyFoodList\n");
Console.WriteLine("Çıkmak için bir tuşa basınız");
Console.ReadLine();
host.Close(); // Servis kapatılır
}
}
}</pre>
<p>WCF Servis sözleşmemiz içerisinde yer alan <strong>GetDailyFoodList</strong> operasyonu, <strong>string</strong> parametre alıp <strong>RSS 2.0</strong> formatında içerik üreten basit bir fonksiyonellik sunmaktadır. Bu operasyonun <strong>HTTP Get </strong>taleplerine cevap verebilmesi istendiğinden <strong>WebGet</strong> niteliği ile imzalanması gerekmektedir. Diğer yandan WCF çalışma zamanının <strong>REST</strong> tabanlı talepleri değerlendirmesi istendiğinden <strong>ServiceHost</strong> yerine <strong>WebServiceHost</strong> tipinin kullanılması gerektiğide aşikardır. Bunun dışında servis operasyonumuz tamamen deneysel olarak günlük öneri yemek listesini üretmektedir.</p>
<p>Pekala dünya üzerindeki restoran zincirlerine veya herhangibir evin mutfağındaki dokunmatik ekranlara bu tip bir servis yardımıyla hizmet götürüyor olsaydık daha fazla parametre alacak ve veri kaynağı olarak <strong>Azure</strong> üzerinde yer alacak bir <strong>Database Service'</strong> ini kullanacak bir operasyon da geliştirebilirdik. Kimbilir belki ilerleyen zamanlarda bu tip komple bir örneğide geliştirme fırsatımız olur. <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> </p>
<p>Servis uygulamamız tarafında çalışma zamanı konfigurasyon bilgileri içinde <strong>App.config</strong> dosyasının aşağıdaki gibi düzenlenmesi yeterlidir.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<webHttpRelayBinding>
<binding name="DailyFoodListServiceBinding">
<security relayClientAuthenticationType="None" />
</binding>
</webHttpRelayBinding>
</bindings>
<services>
<service behaviorConfiguration="DailyFoodServiceBehavior" name="ServerApp.DailyFoodListService">
<endpoint address="" behaviorConfiguration="credentialBehavior" binding="webHttpRelayBinding" bindingConfiguration="DailyFoodListServiceBinding" name="RelayEndpoint" contract="ServerApp.IDailyFoodListContract" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="credentialBehavior">
<transportClientEndpointBehavior credentialType="SharedSecret">
<clientCredentials>
<sharedSecret issuerName="Sizin Issuer Name değeriniz" issuerSecret="Sizin için üretilen Key değeri"/>
</clientCredentials>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="DailyFoodServiceBehavior">
<serviceDebug httpHelpPageEnabled="false" httpsHelpPageEnabled="false" includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration></pre>
<p>Konfigurasyon içeriğinde dikkat çekici noktaların başında kullanılan bağlayıcı tip gelmektedir(<strong>webHttpRelayBinding</strong>). Bu gereklidir nitekim <strong>Service Bus</strong> ile iletişim kurulacaktır. Diğer yandan <strong>clientCredentials</strong> elementi içerisinde, <strong>Service Bus</strong> projemizdeki ilgili <strong>Namespace</strong> için üretilen <strong>Issuer Name </strong>ve <strong>Issuer Key </strong>değerleri yer almalıdır. Bundan sonrası son derece kolaydır. Servis uygulaması çalıştırıldıktan sonra tarayıcı üzerinden <strong>GetDailyFoodList</strong> operasyonuna yapılan çağrı aşağıdaki örnek ekran görüntüsünde olduğu gibi karşılanacaktır.</p>
<p><img src="/pics/2009%2f11%2fblg98_Runtime.gif" alt="" /></p>
<p>Görüldüğü üzere <strong>Wednesday</strong> için bir talepte bulunulmuş ve bir içerik elde edilmiştir. Bu örnekte en çok dikkat edilmesi gereken nokta ise operasyon talebinin yapıldığı adres bilgisidir.</p>
<p><strong>https</strong>://myfoodcompany.servicebus.windows.net/Foods/<strong>GetDailyFoodList?Day=Wednesday</strong> Volaaa!!! <img title="Laughing" src="/editors/tiny_mce3/plugins/emotions/img/smiley-laughing.gif" alt="Laughing" border="0" /> Parametreyi nasıl gönderdiğimize, https protokolüne göre bir URL bilgisi yazıldığına dikkat edilmelidir.</p>
<p>Tabiki işin sağlamasını yapmak amacıyla servis uygulamasını kapatıp aynı talebi göndermeyi deneyebilirisiniz. Bu durumda aşağıdaki ekran görüntüsü ile karşılaşılacaktır.</p>
<p><img src="/pics/2009%2f11%2fblg98_ServiceNotRunning.gif" alt="" /></p>
<p>Yanlız burada dikkat edilmesi gereken noktalardan birisi de, geriye bir istisna(Exception) mesajının gönderilmeyişidir. Bu çok doğaldır nitekim servis uygulaması çalışmıyor olsa bile Service Bus üzerinde gelen talebin değerlendirildiği bir hizmet bulunmaktadır.</p>
<p>Örneği geliştirirken meraktan yaptığım bir testte yanlış <strong>Issuer Key </strong>değeri göndermek oldu. Böyle bir vakada gönderilen<strong> HTTP Get</strong> talebi sonrası aşağıdaki ekran görüntüsü ile karşılaşılacaktır.</p>
<p><img src="/pics/2009%2f11%2fblg98_WrongKey.gif" alt="" /></p>
<p>Görüldüğü üzere <strong>401 Unauthorized</strong> hatasını aldık. Bir başka deyişle <strong>Credential</strong> bilgilerimiz doğrulanmadı.</p>
<p>Bu hızlı örnek ile <strong>Service Bus</strong> hizmetinden <strong>REST</strong> bazlı olarakta nasıl yararlanabileceğimizi görmüş olduk. Bir önceki yazımızda kullandığımız örnekte geliştirdiğimiz istemci uygulamada hatırlayacağınız üzere, sözleşme tanımlamış, kanal oluşturmuş ve TCP bazlı olan iletişim üzerinden kanal bazlı metod çağrısı ile isteğimizi <strong>Service Bus </strong>tarafına göndermiştik. <strong>REST</strong> modelinde ise bir istemci geliştirmediğimizi sadece bir <strong>URL</strong> kullandığımızı hatırlatmak isterim. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2009%2f11%2fRestBased.rar">RestBased.rar (25,30 kb)</a></p>2009-11-19T23:45:00+00:00windows azureservice buswcfrestbsenyurtBir önceki yazımızda Microsoft.Net Services alt yapsının önemli parçalarından birisi olan Service Bus hizmetini incelemeye çalışmış ve basit bir Hello World uygulama koleksiyonu geliştirmiştik. Bu yazımızda ise REST bazlı geliştirilen bir WCF servisine herhangibir tarayıcı yardımıyla HTTP Get metoduna göre, Service Bus üzerinden nasıl ulaşabileceğimizi incelemeye çalışacağız...https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=34939e03-6610-4eb5-a64c-091a2cc43e780https://buraksenyurt.com/trackback.axd?id=34939e03-6610-4eb5-a64c-091a2cc43e78https://buraksenyurt.com/post/MicrosoftNet-Services-Service-Bus-icin-REST-Tabanli-Hello-World#commenthttps://buraksenyurt.com/syndication.axd?post=34939e03-6610-4eb5-a64c-091a2cc43e78https://buraksenyurt.com/post/Microsoft-DotNet-Services-Service-Bus-Hello-WorldMicrosoft.Net Services - Service Bus için Hello World2009-11-11T00:45:00+00:00bsenyurt<p><strong><img style="float: right;" src="/pics/2009%2f11%2fblg97_Giris.jpg" alt="" /></strong></p>
<p>Merhaba Arkadaşlar,</p>
<p>Bu gün itibairyle <strong>İstanbul'</strong> da sağnak yağışlı bir hava hakim. Oysaki bir kaç güne kadar güneşli ve ılıman bir hava vardı. Hal böyle olunca <strong>Cloud Computing</strong> ile ilgili bir şeyler karıştırmanın tam vaktidir diye düşündüm. Daha önceki <a title="Windows Azure Service Platformu Hakkında İlk İzlenimler" href="https://buraksenyurt.com/post/Windows-Azure-Service-Platform-What-Is" target="_blank">Windows Azure Service Platformu Hakkında İlk İzlenimler </a>başlıklı yazımızda <a title="Amazon Bookstore" href="http://www.amazon.com" target="_blank">Amazon' </a>dan <strong>Cloud Computing</strong> <strong>with Windows Azure Platform </strong>isimli bir kitabı sipariş ettiğimi ve önümüzdeki dönemlerde bu konu ile ilişkili yazılarımı sizlerle paylaşacağımı belirtmiştim.</p>
<p>Ne var ki aradan geçen uzun süreye ve <strong>Amazon' </strong>dan kitabı elden teslim eden kurye ile sipariş etmeme rağmen kitap elime bir türlü ulaşmadı <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /> ve Amerika' da bir çıkış noktasında takıldı kaldı. Oysaki kütüphanede yer alan sayısız kitap hep sorunsuz ulaşmıştı. Bir kargo firması bir Amazon ile yazışma derken arada gidip gelen sayısız elektronik postanın arkasından en azından paramı geri almaya başardım ama ne varki kitabıma ulaşamadım. Peki yıldım mı? Yılmadım. Bu kez siparişimi <a title="Amazon Co Uk" href="http://www.amazon.co.uk" target="_blank">Amazon.co.uk </a>sitesinden verdim<em>(Sterlin farklarını hesaba katmanızı öneririm)</em>. Kitap siparişin bir sonraki gününde <strong>UPS</strong> tarafından bana ulaştırıldı.</p>
<p>En azından içim rahatladı ve kitabıma kavuştum.<img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Gel gelelim şu an okuduğunuz yazıyı yazmak için bu kitabı bir günde bitirmedim elbetteki. Aslına bakarsanız geçtiğimiz günlerde <strong>.Net Services SDK'</strong> sının Kasım sürümü ve çok doğal olarak dökümantasyonu yayınlandı. İşte bu yazımızda dökümantasyondan edindiğim ilk izlenimler ışığında geliştireceğimiz basit bir Hello World örneği yazmaya çalışıyor olacağız.</p>
<p><strong>Windows Azure </strong>platformunun önemli parçalarından birisi olan<strong> Microsoft .Net Services</strong>, internet tabanlı uygulama servisleri olarak düşünülebilir. Bu anlmada internet tabanlı uygulamaların Cloud üzerinde yer alan uygulamalar veya <strong>kaynaklar(Resources)</strong> ile iletişimini servis bazlı olarak koordine edebilen bir servis alt yapısı olarak düşünülebilir. Şu aşamada <strong>Microsoft .Net Service'</strong> lerin iki uygulama biçimi vardır. <strong>Service Bus </strong>ve <strong>Access Control Service</strong>. Özellikle <strong>Firewall </strong>arkasında kalan istemcilerin <strong>Cloud </strong>üzerinde yer alan bir uygulama ile haberleşmesi sırasında gerekli olan karmaşık konfigurasyon işlemleri, güvenlik gibi konuları <strong>Service Bus </strong>üzerine alarak kolay bir şekilde çözümlemeye çalışır.</p>
<p>Öyleki Firewall arkasında duran uygulamaların Cloud üzerindeki bir uygulama ile olan haberleşmesinde genellikle port açılması veya VPN kullanılması yolu tercih edilir. Port açılması bir güvenlik riski doğurmakla birlikte, VPN kullanımında da sistem seviyesinde karmaşık konfigurasyon ayarları yapılması gerekmektedir. Oysaki Service Bus bu karmaşıklığı ele alarak istemcilerin Cloud üzerindeki uygulamalar ile konuşabilmesini kolaylaştırmaktadır. Üstelin <strong>Authentication </strong>gibi işlevlere de sahiptir. </p>
<p><strong>Service Bus</strong> çok basit anlamda birbirlerine <strong>zayıf bağlı olan(Loosely Coupled) </strong>uygulamaların güvenli bir şekilde iletişim kurabilmesini sağlamak, platforma bakılmaksızın gerekli karmaşık konfigurasyon ayarlarını sağlamak amacıyla kullanılmaktadır. İlk etapta <strong>Windows Azure</strong> platformu üzerinde yer alan <strong>Azure</strong> ve <strong>SQL Service </strong>uygulamaları ile olan iletişiminde kullanılabileceği düşünülebilir. Bu açıdan bakıldığında Azure platformu üzerindeki uygulamalar ve veritabanları ile haberleşilirken kullanılan bir servis alt yapısı olarakta görülebilir. Aşağıdaki şekil <strong>Service Bus</strong> alt yapısını bu açıdan değerlendirmektedir.</p>
<p><img src="/pics/2009%2f11%2fblg97_ArchitectureLast.gif" alt="" /></p>
<p>Aslında bu şekil bize şunları ifade etmektedir; <strong>App A</strong>, üzerinde bulunduğu <strong>Platform</strong>' daki <strong>Firewall </strong>gibi sorunlara takılmadan <strong>Azure Platform' </strong>u üzerinde konuşlandırılmış bir Cloud servisine, uygulamasına veya kaynağına(Resource) erişmek için <strong>Service Bus </strong>alt yapısını kullanmaktadır. Şekilde yer alan <strong>App B</strong>, Cloud üzerinde yer alan bir uygulama olarak düşünülmektedir. Buna göre <strong>App A </strong>ile <strong>App B' </strong>nin haberleşmesinde <strong>Service Bus</strong> gerekli bağlantıyı, koordinasyonu sağlamakta ve güvenli bir iletişimi tesis etmektedir. Diğer taraftan <strong>App A</strong> yine <strong>Service Bus </strong>aracılığıyla başka bir platform üzerinde yer alan <strong>App C</strong> isimli uygulama ilede güvenli bir iletişim sağlayabilmektedir.</p>
<p>Peki<strong> Service Bus</strong> alt yapısının en belirgin özellikleri nelerdir?</p>
<ul>
<li><strong>Firewall, NAT Gateway</strong> gibi unsurların arkasında duran uygulama ve servislerin birbirleriyle haberleşebilmelerini gerekli konfigurasyon ayarlamalarını üstüne aldığı için kolaylaştırır. Geliştiricinin veya tarafların hangi sistem gereksinimlerine ihtiyaçları olduğunu, bulundukları farklı platformlar arasındaki haberleşme sorunlarını düşünmelerine gerek yoktur.</li>
<li>Standart <strong>REST</strong> modelini de desteklediğinden kolay bir şekilde kullanılabilir ama istenirse <strong>WCF</strong> bazlı yaklaşım değerlendirilerek profesyon programcılar tarafından değerlendirilmeside sağlanabilir.</li>
<li><strong>.Net</strong> platformundan olmayan uygulamalara <strong>REST</strong> ve <strong>HTTP</strong> tabanlı erişilebilmesini sağlar.</li>
<li>Cloud üzerindeki servislere <strong>Anonymous</strong> kullanıcıların erişebilmesi, izin verildiği takdirde mümkündür.</li>
<li>Servislerin internet üzerinden erişilebilen sabit <strong>URL</strong> adresleri ile <strong>keşfedilmesi(Discovery)</strong> lokasyona bakılmaksızın mümkündür.</li>
<li>Servislere yapılan şüpheli saldırıların bloklanmasına yardımcı olur.</li>
</ul>
<p>vb...</p>
<p>Bu kısa <strong>How To</strong> niteliğindeki yazımızda aynı makine üzerinde yer alan bir istemci ile yine aynı makine üzerinde yer alan ve servisi host eden başka bir uygulama arasında <strong>Service Bus</strong> aracılığıyla <strong>Credential</strong> bazlı bir iletişimin nasıl kurulabileceği incelenmektedir. Gerçek anlamda <strong>Cloud</strong> üzerindeki bir uygulama, servis veya kaynak ile haberleşilmese de durumu simule edebileceğimiz bir örnek olacaktır.</p>
<p>Tabiki işin daha çok detayı vardır ancak adet olduğu üzere konuyu kavramının en iyi yolunun çok basit bir örnek geliştirmekle mümkün olabileceği kanısındayım. İşlemlere başlamadan önce <a title="Microsoft.Net Services SDK" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=c80ebadf-7eb8-4a62-abcd-0b57fa3855f8&displaylang=en" target="_blank">Microsoft .Net Services SDK' sının Kasım 2009 </a>sürümünü indirmemiz ve sistemimize yüklememiz gerekmektedir. Bu <strong>SDK</strong> içerisinde <strong>.Net Services</strong> olanaklarından yararlabilmemiz için gerekli tipler ve üyeleri yer almaktadır. <strong>SDK'</strong> nın yüklenmesi yeterli değildir. Ayrıca <strong>Windows Azure</strong> platformu üzerinden bir servis hesabının açılması ve burada kullanacağımız<strong> Service Bus</strong> için bir <strong>Namespace</strong> bildirimi yapılması gerekmektedir. Söz konusu hizmetlerden şu an için ücretsiz yararlanılabilmekte olup <strong>2010</strong> içerisinde ücrete tabi olacağına dair bilgiler de yer almaktadır. <em>(Ancak yazıyı hazırladığım bu günlerde <strong>Microsoft.Net Service'</strong> leri ücretsiz olarak kullanılabilmekteydi.)</em> Kayıt işlemleri için <a href="https://netservices.azure.com/">https://netservices.azure.com/</a> adresinden yararlanılmaktadır. Örneğin benim <strong>Azure</strong> üzerinde yer alan projemde bu yazımızdaki örnek için oluşturduğum <strong>AlgebraService Namespace </strong>ve bilgileri aşağıdaki şekilde görüldüğü gibidir.</p>
<p><img src="/pics/2009%2f11%2fblg97_ServiceNamespace.png" alt="" /></p>
<p>Dilerseniz <strong>Namespace</strong> detaylarına da bakabilir gerekirse silerek hizmetten kaldırabilirsiniz. <strong>Namespace</strong> oluşturulduktan sonra istemci ve servis tarafının kullanacağı <strong>ehliyet(Credential)</strong> bilgilerinin de otomatik olarak oluşturulduğu görülecektir. <strong>Service Bus</strong> örneğimiz için bunlar <strong>Default Issuer Name</strong> ve <strong>Default Issuer Key</strong> değerleridir. Bu bilgiler <strong>Service Namespace'</strong> ine ait <strong>Summary</strong> bölgesinde görülebilmektedir.</p>
<p><img src="/pics/2009%2f11%2fblg97_Summary.gif" alt="" /></p>
<p>Örneğimizde servis ve istemci uygulamalar aynı makine üzerinde geliştirilecek olsalarda, aralarındaki <strong>Credential</strong> tabanlı iletişim için yukarıda bilgileri yer alan Service Bus hizmeti kullanılacaktır. <strong>Service</strong> ve <strong>Host</strong> uygulamalarımız <strong>Visual Studio 2008</strong> ortamında geliştirilmekte olan basit <strong>Console</strong> uygulamalarıdır ve her ikiside, <strong>System.ServiceModel</strong> ile <strong>.Net Services SDK'</strong> sının yüklenmesi sonrasında gelen <strong>Microsoft.ServiceBus</strong> <strong>assembly'</strong> larını referans etmektedir.</p>
<p><img src="/pics/2009%2f11%2fblg97_References.gif" alt="" /></p>
<p>Servis tarafındaki kodlarımızı aşağıdaki gibi geliştirebiliriz.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using Microsoft.ServiceBus;
namespace AlgebraHost
{
// Servis sözleşmesi
[ServiceContract(Namespace = "http://algebraservice/ServiceBus/")]
public interface IAlgebraContract
{
[OperationContract]
double Sum(double x, double y);
}
public interface IAlgebraChannel
: IAlgebraContract, IClientChannel
{
}
// Sözleşmeyi uygulayan tip
[ServiceBehavior(Name="Algebra")]
public class AlgebraService
: IAlgebraContract
{
#region IAlgebraContract Members
public double Sum(double x, double y)
{
return x + y;
}
#endregion
}
class Program
{
static void Main(string[] args)
{
// Servis adresi elde edilir
// İlk parametre schema, ikinci parametre Service Bus üzerinde oluşturulan Solution adı ve üçüncü parametrede servis yoludur
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", "AlgebraService", "AlgebraService");
// İletişim için gerekli olan issuer adı ve şifresi bilgileri TransportClientEndpointBehavior nesne örneğinde toplanır
TransportClientEndpointBehavior credential = new TransportClientEndpointBehavior();
credential.CredentialType = TransportClientCredentialType.SharedSecret; // Credential tipi
credential.Credentials.SharedSecret.IssuerName = "SİZİN ISSUER NAME DEĞERİNİZİ"; // Issuer adı
credential.Credentials.SharedSecret.IssuerSecret = "SİZİN İÇİN ÜRETİLEN KEY DEĞERİ// Issuer için otomatik üretilmiş olan key değeri
// ServiceHost nesne örneklenir
// İlk parametre servis tipidir
// İkinci parametre ise servis adresidir
ServiceHost host = new ServiceHost(typeof(AlgebraService), serviceUri);
IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
// Config dosyasında tanımlanan tüm Endpoint' lere gerekli Credential davranışı eklenir.
foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
{
endpoint.Behaviors.Add(serviceRegistrySettings);
endpoint.Behaviors.Add(credential);
}
// Servis açılır
host.Open();
Console.WriteLine("Servisin orjina adresi \n {0}:\n Service Durumu {1} ",serviceUri,host.State);
Console.WriteLine("Kapatmak için bir tuşa basınız");
Console.ReadLine();
// Servis kapatılır
host.Close();
}
}
}</pre>
<p>Aslında standart bir <strong>WCF</strong> Servisi yazılmış ve <strong>host</strong> edilmiştir. Ancak <strong>Service Bus</strong> üzerinde tanımlı <strong>Service Namespace'</strong> in kullanılması içinde bir takım ek işlemler yapılmıştır. Söz gelimi bu iletişim için gerekli <strong>Credential</strong> bilgileri <strong>TransportClientCredentialType</strong> tipi yardımıyla servisin üzerindeki tüm <strong>endPoint'</strong> lere birer çalışma zamanı <strong>davranışı(Behavior)</strong> olarak bildirilmektedir. Buna göre servis, istemci ile olan tüm iletişiminde <strong>Azure</strong> üzerindeki projemiz için üretilen <strong>Name</strong> ve <strong>Key </strong>değerleri kullanılacaktır.</p>
<p>Diğer yandan servisin adresi belirlenirken, <strong>Service Namespace </strong>bilgisinin kullanıldığı dikkatten kaçmamalıdır. Nitekim <strong>Azure</strong> üzerindeki ilgili servisin adresinin bilinmesi gerekmektedir. Bu amaçla <strong>sb</strong> isimli <strong>Service Bus</strong> schema adından da <strong>CreateServiceUri</strong> metodu içerisinde yararlanılmaktadır. Elbette servis tarafında <strong>WCF çalışma zamanı(WCF Runtim)</strong> için gerekli konfigurasyon ayarlarının da bildirilmesi gerekmektedir. Bu amaçla servis uygulamasına ait <strong>App.config </strong>dosyası aşağıdaki gibi geliştirilebilir.</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="AlgebraHost.AlgebraService">
<endpoint contract="AlgebraHost.IAlgebraContract" binding="netTcpRelayBinding"/>
</service>
</services>
</system.serviceModel>
</configuration></pre>
<p>Dikkat çekici nokta <strong>TCP</strong> bazlı iletişim için kullanılan <strong>bağlayıcı tiptir(Binding Type).</strong></p>
<p>Gelelim yine Console olarak tasarladığımız istemci uygulama tarafı kodlarına.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.ServiceModel;
using Microsoft.ServiceBus;
namespace AlgebraClient
{
// Sözleşme tipi(Contract Type)
[ServiceContract(Namespace = "http://algebraservice/ServiceBus/")]
public interface IAlgebraContract
{
[OperationContract]
double Sum(double x, double y);
}
public interface IAlgebraChannel
: IAlgebraContract, IClientChannel
{
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Başlamak için bir tuşa basınız");
Console.ReadLine();
// Bağlantı protokolünün (Http, Tcp) otomatik olarak belirleneceği bildirilir
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
string sbNamespace = "AlgebraService";
string sbIssuer = "SİZİN ISSUER NAME DEĞERİNİZ";
string sbIssuerKey = "SİZİN ISSUER KEY DEĞERİNİZ";
// Servis adresi üretilir
Uri serviceUri = ServiceBusEnvironment.CreateServiceUri("sb", sbNamespace, "AlgebraService");
// İletişim için gerekli olan issuer adı ve şifresi TransportClientEndpointBehavior tipinden nesne örneği ile bildirilir.
TransportClientEndpointBehavior credential = new TransportClientEndpointBehavior();
credential.CredentialType = TransportClientCredentialType.SharedSecret;
credential.Credentials.SharedSecret.IssuerName = sbIssuer;
credential.Credentials.SharedSecret.IssuerSecret = sbIssuerKey;
// İletişimin kanalını üretecek olan fabrika nesnesi oluşturulur. İlk parametre ile config dosyasındaki Client Endpoint yeri belirtilir, ikinci parametre ilede Service Bus üzerindeki adres bilgisi belirtilir
ChannelFactory<IAlgebraChannel> channelFactory = new ChannelFactory<IAlgebraChannel>("AlgebraEndpoint", new EndpointAddress(serviceUri));
// İletişimin hangi kullanıcı adı ve şifre ile gerçekleştirileceği ilgili TransportClientEndpointBehavior nesne örneğinin davranış olarak bildirilmesiyle gerçeklenir
channelFactory.Endpoint.Behaviors.Add(credential);
// İletişim kanalı oluşturulur ve açılır
IAlgebraChannel clientChannel = channelFactory.CreateChannel();
clientChannel.Open();
// Sum operasyonuna çağrı yapılır
Console.WriteLine("Sum Result {0} + {1} = {2} ", 2,4,clientChannel.Sum(2,4).ToString());
// İletişim kanalı ve kanal üretme fabrikası kapatılır
clientChannel.Close();
channelFactory.Close();
}
}
}</pre>
<p>İstemci tarafında da dikkat edileceği üzere Servis sözleşmesnin bir kopyası yer almaktadır. Nitekim çalışma zamanındaki <strong>proxy</strong> üretimi için servis sözleşmesinin sunduğu içeriğin bilinmesi gerekmektedir. Burada devreye ilgili servis sözleşmesini implemente eden kanal arayüz referansıda girmektedir. İstemci tarafı için yapılan adımlar aslında sırasıyla aşağıdaki gibidir;</p>
<ol>
<li>Bağlantı modu belirlenir<strong><em>(ConnectivityMode)</em></strong></li>
<li>Host servisin adresi belirlenir<em>(Uri bilgisi belirlenirken Azure Projesi üzerinde oluşturduğumuz <strong>Service Namespace </strong>adı kullanılır)</em></li>
<li>Gerekli <strong>Crendetial</strong> tanımlamaları yapılır ve bağlantı için uygulanması sağlanır<strong><em>(TransportClientEndpointBehavior)</em></strong></li>
<li>Kanal oluşturulur ve <strong>Credential'</strong> ı değerlendirmesi <strong>davranış(Behavior)</strong> eklenmesi yardımıyla belirtilir</li>
<li>Kanal bağlantısı açılır.</li>
<li>Gerekli servis operasyonları icra edilir.<em>(Kobay olarak sıkça kulladığımız <strong>Sum </strong>operasyonu <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> )</em></li>
<li>Bağlantılar kapatılır.</li>
</ol>
<p>Çok doğal olarak istemci uygulamanın <strong>WCF Çalışma zamanı</strong> içinde bir takım konfigırasyon ayarlarının yapılması gerekmektedir. İşte istemci tarafı config dosyası içeriği;</p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false"><?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint name="AlgebraEndpoint" contract="AlgebraClient.IAlgebraContract" binding="netTcpRelayBinding"/>
<!-- Service Bus ile iletişim kurmak için TCP protokolü kullanılacaktır. netTcpRelayBinding bunu belirtmektedir-->
</client>
</system.serviceModel>
</configuration></pre>
<p>Önce sunucu uygulamamız sonrasında ise istemci uygulamamız çalıştırıldığında aşağıdakine benzer bir ekran görüntüsü ile karşılaşılması muhtemeldir.</p>
<p><img src="/pics/2009%2f11%2fblg97_Runtime.gif" alt="" /></p>
<p>Eğer bu şekilde bir sonuç aldıysak istemci uygulamamızın host edilen servis ile <strong>Service Bus</strong> üzerinden haberleştiğini düşünebiliriz. Aslında emin olmak için deneme amacıyla oluşturduğumuz <strong>Service Namespace'</strong> ini kaldırmamız yeterli olacaktır <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /> Lakin bu durumda aşağıdaki sonuç ile karşılaşırız<strong>(EndpointNotFoundException)</strong></p>
<p><img src="/pics/2009%2f11%2fblg97_Exception.gif" alt="" /></p>
<p>Böylece <strong>Azure Service Platformu</strong> üzerindeki ilk atılımımızı gerçekleştirmiş olduk arkadaşlar. Umarım birşeyler aktarabilmişimdir. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2009%2f11%2fAlgebraHost.rar">AlgebraHost.rar (47,27 kb)</a></p>2009-11-11T00:45:00+00:00windows azureservice buswcfbsenyurtDaha önceki Windows Azure Service Platformu Hakkında İlk İzlenimler başlıklı yazımızda Amazon' dan Cloud Computing with Windows Azure Platform isimli bir kitabı sipariş ettiğimi ve önümüzdeki dönemlerde bu konu ile ilişkili yazılarımı sizlerle paylaşacağımı belirtmiştim.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=43a76b4a-1d10-4869-906b-7f728a4bf6321https://buraksenyurt.com/trackback.axd?id=43a76b4a-1d10-4869-906b-7f728a4bf632https://buraksenyurt.com/post/Microsoft-DotNet-Services-Service-Bus-Hello-World#commenthttps://buraksenyurt.com/syndication.axd?post=43a76b4a-1d10-4869-906b-7f728a4bf632https://buraksenyurt.com/post/Windows-Azure-Service-Platform-What-IsWindows Azure Service Platformu Hakkında İlk İzlenimler2009-10-22T07:15:00+00:00bsenyurt<p><img style="float: right;" src="/pics/2009%2f10%2fblg91_Giris.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Güneşli açık bir hava ve sessiz bir gün yada gece...Deniz kenarında veya caddenin herhangibir köşesinde...Mutlaka zaman zaman gökyüzüne bakıp bulutları bazı nesnelere benzettiğimiz olmuştur. Yandaki resimde görüldüğü gibi gülen bir bulutla karşılaşma ihtimalimiz az olsada, arabaya, ördeğe veya başka bir şekle benzettiğimiz bulut sayısı oldukça fazladır. Bugünkü yazımızda bulutlar ile pek bir haşır neşir olacağımızı düşünebilirsiniz. Ancak tabiki yazılımsal anlamda <img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p><strong>Microsoft'</strong> un son yıllarda <strong>Cloud Computing</strong> mimarisi için getirdiği geliştirmelerden biriside <strong>Windows Azure Services</strong> platformudur. Bu platformu servis bazlı bir işletim sistemi olarak düşünebiliriz. Ama bu çok basit bir yaklaşım olur. Bu konuda aslında pek çok kaynakta yazılmakta ve çizilmektedir. Ancak ürün henüz nihai halini almadığından sürekli olarak değişimlere uğramaktadır. Söz gelimi daha önce yayınlanan <strong>SDK</strong> içerisine <strong>Microsoft.Net Services </strong>bloku içerisinde yer alan <strong>Workflow Services</strong> modeli, <strong>Temmuz 2009'</strong> da yayınlanan <strong>CTP </strong>sürümünde kaldırılmışdır. Aslında konunun detaylarına girdiğimde çok kısa bir sürede kaybolduğumu ifade edebilirim. Bu nedenle yazımızın bundan sonraki kısımlarında mimarinin ne getirdiğini sizlere araştırma sonuçlarımdan aktarmaya çalışacağım.</p>
<p><strong>Windows Azure Service</strong> Platformu iki ana parçayı içermektedir. İlk parça olan <strong>Windows Azure</strong>, bulut tabanlı işletim sistemidir. Bu işletim sistemi üzerinde ise çeşitli servis inşa blokları(<strong>Building Blocks</strong>) yer alır<em>(Microsoft SQL Services, Microsoft .Net Services, Live Services, Microsoft Sharepoint Services, Microsoft Dynamics CRM Services) </em>gibi. Aşağıdaki şekilde söz konusu mimari model daha net görülebilmektedir.</p>
<p> </p>
<p><img src="/pics/2009%2f10%2fblg91_Architecture.gif" alt="" /></p>
<p> </p>
<p><strong>Windows Azure</strong> platformunu aslında şu cümle ile tanımlayabiliriz; <strong>Azure</strong>, <strong>internet tabanlı bulut bilişim ortamını(Internet Based Cloud Computing) </strong>sağlayarak, uygulamaların çalıştırılması veya verinin saklanması için <strong>Microsoft</strong> <strong>veri merkezlerinin(Data Centers)</strong> kullanılabilmesini sağlayan bir platformdur. Bu tanımlamaya göre <strong>Windows Azure Service</strong> platformunu bir <strong>Cloud Computing Fabrikası </strong>olarak düşünülebilir. Öyleki bir veri merkezi olarak, uygulama veya servislerin <strong>Internet</strong> üzerinde <strong>geliştirilmesi(Development)</strong>, <strong>dağıtılması(Deployement, yönetilmesi(Management) </strong>mümkündür. Bu açıdan bakıldığında <strong>Windows Azure Service</strong> platformunun iki temel fonksiyonelliği olduğu söylenebilir. Uygulama çalıştırmak ve veri saklamak.</p>
<p>Peki <strong>Internet</strong> üzerinde yer alan böyle bir bulut kümesinin ne gibi bir faydası olabilir? Herşeyden önce uygulamaların çalıştırılacağı verinin fiziki olarak saklanacağı ortama ait <strong>IT</strong> karmaşıklığını düşünememize gerek kalmamaktadır. Bir başka deyişle <strong>host </strong>ortamının fiziki sunucu özelliklerinin ayarlanması, oluşturulması, bunlar için gerekli yazılımların tesis edilmesi gibi maliyetlerin düşünülmesine gerek kalmamaktadır. Üstelik <strong>Cloud </strong>içerisine dahil edilen uygulama veya veri kümelerinin istenen anda istenilen yerden kullanılabilmesi de mümkündür.</p>
<p><strong>Windows Azure</strong> tarafında önem arz eden kavramlardan olan <strong>veri depolama(Data Storage)</strong> bloku, <strong>BLOB(Binary Large OBjects), kuyruk(Queue) </strong>ve <strong>basit tablo(Simple Table) </strong>verilerinin saklanması için gerekli servisleri sunmaktadır. Ancak aksine ilişkisel veritabanları tarafından sunulan, <strong>sorgulama(query), arama(Search),raporlama(Reporting) </strong>vb yetenekleri sağlamamaktadır. Bu yeteneklerin, <strong>Cloud </strong>üzerinde saklanan veri kümelerinde kullanılabilmesi için <strong>Microsoft SQL Services'</strong> lerden yararlanılması gerekmektedir.</p>
<p><strong>Microsoft .Net Services</strong> şu anda 2 temel fonksiyonelliği karşılamaktadır. <strong>Uygulamalar arası bağlanabilirlik(Application Connectivity) </strong>ve<strong> Erişim kontrolü(Access Control).</strong> Uygulamalar arası bağlanılabilirlik için <strong>Microsoft .NET Services Bus</strong> bloku kullanılmaktadır. Bu blok, çeşitli mesajlaşma desenlerine göre <strong>Internet</strong> üzerindeki uygulamalar arasında bir <strong>network</strong> altyapısının oluşturulabilmesini sağlamaktadır. Erişim kontrolü için <strong>Microsoft .NET Access Control Service</strong> bloku ele alınır. Bu blok ile aslında <strong>Claims</strong> tabanlı erişim kontrolünün Cloud üzerinde gerçeklenmesi sağlanır.</p>
<p>Aslında <strong>Microsoft .Net Service'</strong> leri, bütünüyle servis bazlı geliştirme fabrikası olarak düşünülebilir. <strong>Microsoft .Net Service'</strong> lerini geliştirirken kullanılan <strong>SDK</strong>, <strong>WCF</strong> ile entegrasyon da sağlamaktadır. Bu sayede var olan <strong>.Net</strong> geliştirme teknikleri ile tasarlanan <strong>WCF</strong> uygulamalarının <strong>Cloud</strong> servisi haline getirilmesi mümkündür. Önemli olan noktalardan bir diğeride, <strong>Microsoft .Net Service'</strong> in sadece <strong>.Net</strong> geliştiriciler için tasarlanmış olmayışıdır. Desteklenen<strong> REST, SOAP, WS*</strong> gibi protokoller sayesinde <strong>Java</strong> ve <strong>Ruby </strong>gibi diller için geliştirilmiş olan <strong>SDK'</strong> lardan yararlanarak da <strong>Cloud</strong> servisleri geliştirilebilir.</p>
<p><a title="Clodu Computing with the Windows Azure Platform" href="http://www.amazon.com/gp/product/0470506385/ref=ox_ya_oh_product" target="_blank"><img style="float: right;" src="/pics/2009%2f10%2fblg91_Book2.jpg" alt="" width="108" height="135" /></a></p>
<p><strong>Windows Azure</strong> platformu ile ilişkili olarak başlangıç noktamız <a href="http://www.microsoft.com/windowsazure/">http://www.microsoft.com/windowsazure/</a> adresi olmalıdır. Bu adresten gerekli <strong>SDK</strong> ve <strong>Visual Studio 2008/2010 Beta X </strong>araçlarının indirilierek kurulması geliştirilmeye başlanması için yeterlidir. Ek olarak örneğin .Net Services geliştirilmesi yapılacaksa bu konu ile ilişkili SDK' nın <a href="http://www.microsoft.com/windowsazure/developers/dotnetservices/">http://www.microsoft.com/windowsazure/developers/dotnetservices/</a> adresinden tedarik edilmesi gerekmektedir.</p>
<p>Ben bu konuya oldukça meraklıyım aslında. Nitekim işin içerisinde <strong>Service</strong> kavramı var <img title="Cool" src="/editors/tiny_mce3/plugins/emotions/img/smiley-cool.gif" alt="Cool" border="0" /> Bu nedenle bende boş durmadım ve önümüzdeki sene <strong>Cloud Computing</strong> ve <strong>Windows Azure </strong>ile ilişkili olan araştırmalarımı daha sağlıklı devam ettirebilmek adına <strong>Amazon'</strong> dan <strong><a title="Cloud Computing with the Azure Platform" href="http://www.amazon.com/Cloud-Computing-Windows-Platform-Programmer/dp/0470506385/ref=sr_1_1?ie=UTF8&s=books&qid=1256228080&sr=8-1" target="_blank">Cloud Computing with the Azure Platform </a></strong>adlı kitabı sipariş ettim. Bakalım önümüzdeki sene <strong>Azure</strong> ile ilişkili olarak ne gibi bir macera beni<em>(ve doğal olarak siz değerli okurlarımı)</em> bekliyor olacak. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2009-10-22T07:15:00+00:00cloud computingwindows azurebsenyurtMicrosoft' un son yıllarda Cloud Computing mimarisi için getirdiği geliştirmelerden biriside Windows Azure Services platformudur. Bu platformu servis bazlı bir işletim sistemi olarak düşünebiliriz. Ama bu çok basit bir yaklaşım olur. Bu konuda aslında pek çok kaynakta yazılmakta ve çizilmektedir. Ancak ürün henüz nihai halini almadığından sürekli olarak değişimlere uğramaktadır. Söz gelimi daha önce yayınlanan SDK içerisine Microsoft.Net Services bloku içerisinde yer alan Workflow Services modeli, Temmuz 2009' da yayınlanan CTP sürümünde kaldırılmışdır. Aslında konunun detaylarına girdiğimde çok kısa bir sürede kaybolduğumu ifade edebilirim. Bu nedenle yazımızın bundan sonraki kısımlarında mimarinin ne getirdiğini sizlere araştırma sonuçlarımdan aktarmaya çalışacağım.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=5e1d348a-f880-49db-99f4-a0f2dffc81462https://buraksenyurt.com/trackback.axd?id=5e1d348a-f880-49db-99f4-a0f2dffc8146https://buraksenyurt.com/post/Windows-Azure-Service-Platform-What-Is#commenthttps://buraksenyurt.com/syndication.axd?post=5e1d348a-f880-49db-99f4-a0f2dffc8146