https://www.buraksenyurt.com/Burak Selim Şenyurt - WCF 4.0 Beta 22010-02-01T07:22:36+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/Correlation-Nedir-Beta-2Correlation Nedir? Yenir mi? İçilir mi?2010-02-01T00:25:00+00:00bsenyurt<p><img style="float: right;" src="/pics/2010%2f1%2fblg126_Giris.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Bazen bir kavramı yada konuyu anlamakta inanılmaz zorlandığınızı hatırlayın. Ne yaparsınız? Kimisi kendisini yemeğe verir. Kimisi hayat küsermişçesine bir köşeye çekilir. Kimisi kendiyle baş başa kalır ve çığlık çığlık haykırır. Kimisi de daha akıllı davranıp bir süre tatile çıkar veya anlayamadığı kavramla ilişkili herhangibir dökümanı bir süreliğine araştırmamaya, okumamaya karar verir. Neredeyse unuturcasına bir zaman koyar araya. Sonrasında ise aynı konuyu tekrar araştırmaya karar verir. İnanın başarılı olma şansı bir önceki denemeye göre çok daha yüksek olacaktır. Önemli olan noktalardan birisi, yılmadan bu iterasyona devam edebilmektir. Okudunuz, hala anlamadınız...Kısa bir ara daha...Sonra tekrar aynı konu ama mümkünse farklı kaynaklarla...<img title="Wink" src="/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" alt="Wink" border="0" /></p>
<p>Bende bir süredir<strong> Workflow Service'</strong> lerde oldukça önemli olan konulardan birisi üzerinde araştırmalarımı tamamen durdurmuştum. <strong>Correlation</strong>. Çünkü; <strong>Matematikte "bağlılaşım/korelasyon"</strong>, <strong>ekonomide "bağlanım"</strong>, <strong>nükleer bilimlerde "bağlantı/eş ilişki"</strong>, <strong>denizbilimde "kaçınım"</strong>, <strong>tıpta "Aferent uyarıların gerekli cevabı oluşturmak üzere beyinin ilgili merkezinde birleşmesi" </strong>olarak çevirileri yer alan bu kavramın, <strong>Workflow Services</strong> içerisinde ne anlama geldiğini anlamak için epey bir süre tepinmem gerekmişti. Geçtiğimiz günlerde aynı konu üzerinde yeniden durmaya ve araştırmaya ve edindiğim bilgileri sizlere paylaşmaya karar verdim. İşte elde ettiğim sonuçlar;</p>
<p><strong>Correlation </strong>kavramını mesajları bir arada gruplamanın bir yolu olarak düşünülebilir ilk etapta. Örneğin bir<strong> talep(Request)</strong> ve bu talebe karşılık gönderilen <strong>cevap(Reply) </strong>arasındaki ilişki <strong>Correlation </strong>olarak ifade edilmektedir. Özellikle <strong>WCF(Windows Communication Foundation)</strong> tarafında <strong>Session </strong>bazlı haberleşmelerde mesajlar arasında bir <strong>Correlation </strong>oluştuğu söylenebilir. Ancak <strong>Correlation' </strong>ın farklı bir yönü daha vardır. Bir <strong>servis örneği(Instance) </strong>ile bir <strong>oturum(Session)</strong> arasında da bağıntı kurulabilir. Yani bir <strong>SessionId</strong> değerine ait olaraktan hareket eden mesajların içeriğinde yer alan bazı veri parçalarının, <strong>Session</strong> ile alakalı bir servis örneği ile eşleştirilmesi mümkün olabilir. Bir başka deyişle aynı <strong>SessionId</strong> değeri altındaki mesajların her zaman için aynı servis örneğine ait olduğunun anlaşılmasında, <strong>SessionID=Service Instance ID</strong> eşitliğinin sağlanması da <strong>Correlation </strong>olarak ifade edilebilir. Bu ilişki çoğunlukla <strong>bilinçsiz(Implicit)</strong> olarak sağlanır. Yani, geliştiricinin çoğu zaman bir aksiyonda bulunmasına gerek yoktur. Aslında bu durumu aşağıdaki şekilde olduğu gibi canlandırabiliriz.</p>
<p><img src="/pics/2010%2f1%2fblg126_Correlation.gif" alt="" /></p>
<p>Ancak <strong>Workflow</strong> örneklerinde uzun zaman süren süreçlerin ele alınması da söz konusudur<strong><em>(Long Running Process)</em></strong>. İstemcilerin, <strong>Workflow Service'</strong> ler ile olan haberleşmelerinde aradaki oturumu kapatıp ayrılmaları bu tip süreçlerde son derece yaygındır. Buna göre istemci ile servis arasındaki oturumun her an sonlanabilir olması önemli bir sorunu ortaya çıkarmaktadır; <strong>Correlation nasıl sağlanacak</strong>? <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /></p>
<p>Bu amaçla <strong>Workflow Service'</strong> lerde <strong>Correlation' </strong>ın sağlanması için kullanılan çeşitli teknikler mevcuttur. Aslında burada da tam bir kavram kargaşası vardır. En güvenilir kaynaklardan birisi olarak ele alacağımız <strong>MSDN</strong>, <strong>Correlation' </strong>ı <strong>Content-Based </strong>ve <strong>Protocol-Based </strong>olmak üzere iki çeşide ayırmıştır. <strong>Protocol-Based Correlation'</strong> da kendi içerisinde <strong>Context </strong>ve <strong>Request-Reply </strong>isimli iki farklı <strong>Correlation </strong>tekniğini daha barındırmaktadır.</p>
<p><strong>Content-Based Correlation'</strong> da <strong>service örneği(Instance) </strong>ile ilişkili olan veri<em>(Map edilmiş veri olaraktan da düşünebiliriz) </em>mesajın içeriğinde yer alır. Örneğin mesajın <strong>Header</strong> veya <strong>Body </strong>kısımlarında bulunabilir. Dolayısıyla <strong>Correlation' </strong>ı sağlayan arabirimlerin <strong>XML </strong>tabanlı olan bu veri içeriğini kontrol edebilmesi gerekmektedir. İşte bu noktada <strong>XPath </strong>gibi sorgu teknikleri devreye girmektedir. <strong>Protocol-Based Correlation </strong>ise iletişim mekanizmasını baz alır ve buna göre mesajlar arasında yada mesajlar ile doğru servis örneği arasında gerekli eşleştirmeyi sağlar.</p>
<p>Bu giriş yazımızda özellikle <strong>Content-Based Correlation</strong> üzerinde durabiliriz. En çok örneklenen model genellikle budur. <strong>Workflow Service' </strong>lerde servise gelen ve servisten giden mesajların içerdiği veri parçaları ile çalışma zamanındaki servis örnekleri arasında eşleştirme yapmak<em>(yani Correlation' ı sağlamak) </em>son derece kolaydır. Tüm mesajlaşma aktivitelerinin <strong>CorrelationInitializers </strong>isimli bir koleksiyonu bulunur. Bu koleksiyon içerisinde <strong>Key-</strong><strong>Query </strong>çiftleri yer almaktadır. Tahmin edileceği üzere <strong>Key </strong>değerleri ile <strong>Query' </strong>lerin birbirlerinden ayrıştırılması sağlanır. En önemli nokta ise <strong>Query' </strong>dir. <strong>Query </strong>içerisinde yer alan <strong>XPath </strong>sorgusu ile <strong>Content </strong>içerisindeki veri işaret edilir. Tabi bir mesajlaşma aktivitesi, diğer bir mesajlaşma aktivitesinin başlattığı <strong>Correlation' </strong>u takip edebilmelidir. Bunun içinde <strong>CorrelationWith </strong>isimli özellikten yararlanılır. Bu bilgilere göre <strong>Correlation' </strong>ın bir şekilde <strong>başlatılması(Initialize) </strong>ve <strong>takip edilmesi(Follow) </strong>gerektiği anlaşılmaktadır. Başlatılan bir <strong>Correlation' </strong>ın takip <span style="text-decoration: underline;">edilmemesi </span>halinde mesajlar ve servis örneği arasında bir eşleştirmenin yapılması söz konusu olmayacaktır. Elbette <strong>Workflow Foundation 4.0 </strong>içerisinde bir <strong>Correlation' </strong>ın başlatılmasını kolaylaştıran bir aktivitede gelmektedir. <strong>InitializeCorrelation </strong>bileşeni.</p>
<p>Sanırım şu ana kadar anlattıklarımız ile kafamızda <strong>Correlation'</strong> ın ne olduğuna dair bir fikir oluşmuştur. Tabi konuyu kavramak tek başına yeterli değildir. Pratiğe dökmemizde yarar vardır. Ancak şu an için bu konudaki araştırmaya ara verip tatile çıkmak niyetindeyim. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2010-02-01T00:25:00+00:00wcfwcf 4.0wfwf 4.0workflow servicesbsenyurtBazen bir kavramı yada konuyu anlamakta inanılmaz zorlandığınızı hatırlayın. Ne yaparsınız? Kimisi kendisini yemeğe verir. Kimisi hayat küsermişçesine bir köşeye çekilir. Kimisi kendiyle baş başa kalır ve çığlık çığlık haykırır. Kimisi de daha akıllı davranıp bir süre tatile çıkar veya anlayamadığı kavramla ilişkili herhangibir dökümanı bir süreliğine araştırmamaya, okumamaya karar verir.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=b69941a7-8ad1-48f1-b562-645bd8f9789f0https://www.buraksenyurt.com/trackback.axd?id=b69941a7-8ad1-48f1-b562-645bd8f9789fhttps://www.buraksenyurt.com/post/Correlation-Nedir-Beta-2#commenthttps://www.buraksenyurt.com/syndication.axd?post=b69941a7-8ad1-48f1-b562-645bd8f9789fhttps://www.buraksenyurt.com/post/WCF-40-Yenilikleri-Workflow-ServicesWCF 4.0 Yenilikleri - Workflow Services [Beta 2]2009-10-19T13:22:00+00:00bsenyurt<p><img style="float: left;" src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_Giris.jpg" alt="" /></p>
<p>Merhaba Arkadaşlar,</p>
<p><strong>WCF </strong>ve <strong>WF </strong>arasında ilişkiyi anlatan güzel bir cümle vardır. <strong>.Net Framework 3.0' </strong>da arkadaş olan <strong>WCF</strong> ve <strong>WF</strong>, <strong>.Net Framework 3.5 </strong>sürümünde nişanlanmış, <strong>.Net Framework 4.0</strong> sürümünde ise evlenmişlerdir. <img title="Wink" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" border="0" alt="Wink" /> Bu ikilinin bir arada ele alınması sonucu <strong>Workflow Services</strong> adı verilen bir ufaklıkta ortaya çıkmıştır. Aslında bir akışın servis bazlı olması son derece önemlidir. Nitekim <strong>WF</strong> tarafında, uzun süreli işlemlerin ele alınması<strong>(Long Running Process),</strong> akışın çeşitli noktalarından farklı anlar için kalıcı olarak saklanabilmesi<strong>(Persistence),</strong> asenkron çalışma zamanı motorunun zaten hazır olarak bulunması söz konusudur. Bu özelliklerin <strong>WCF Servis Noktaları(Endpoints)</strong> ile desteklenmesi, bir akışın ağ üzerindeki istemciler tarafından başlatılabilmesine olanak tanımaktadır. Üstelik bu akışlar sonuçlar üreterek bunları geriye de döndürülebilir. Bu durum aslında <strong>WCF 3.5 </strong>sürümünde de gerçeklenebilmektedir. Ne varki, <strong>WCF 4.0 </strong>tarafında tamamen <strong>declerative </strong>olarak tanımlanabilen ve saf <strong>XAML(eXtensible Application Markup Language)</strong> içeriğinden oluşan bir <strong>Workflow</strong> <strong>Servisinin </strong>geliştirilebilmesi mümkündür. Üstelik<strong> Visual Studio 2010 WF Designer</strong> sayesinde bu <strong>XAML</strong> içeriğinin üretilmesi için IDE desteği de sunulmaktadır.</p>
<p><em><strong>Kişisel Not : Windows XP, Vista</strong> ve <strong>7 </strong>sürümlerinde kullandığım <strong>Visual Studio 2010 Beta 1</strong> ürününde, <strong>WF Designer </strong>sürekli olarak hata verip <strong>IDE'</strong> yi <strong>Restart</strong> işlemine zorlamaktaydı.<img title="Undecided" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" border="0" alt="Undecided" /> Neyseki bu sorun <strong>Visual Studio 2010 Beta 2</strong> sürümünde ortadan kaldırılmış durumdadır.<img title="Wink" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" border="0" alt="Wink" /></em></p>
<p>Dolayısıyla bu yazımızın konusu şimdiden belli oldu. Çok basit ve büyük ihtimalle pek işe yaramayan bir <strong>Workflow Service'</strong> in nasıl geliştirilebileceğini incelemeye çalışıyor olacağız. İşe ilk olarak <strong>Declerative Sequential Service Library </strong>tipinden bir <strong>WCF projesi </strong>oluşturarak başlayacağız. Aşağıdaki ekran görüntüsünde olduğu gibi.</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_NewProject.gif" alt="" /></p>
<p>Örnek olarak <strong>AdventureWFServices</strong> ismiyle oluşturduğumuz projede <strong>Service1.Xamlx </strong>dosyası hemen dikkati çekmektedir. Bu örnek olarak oluşturulan <strong>Workflow Service </strong>örneğidir. Yani Microsoft tarafından sunulan hazır Hello World örneği <img title="Wink" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-wink.gif" border="0" alt="Wink" /> Tamamen <strong>XAML</strong> içeriğinden oluşmaktadır ve istemcilere servis olarak nasıl sunulacağına ilişkin çalışma zamanı bilgileri(WCF Servis konfigurasyon bilgileri) <strong>Web.config</strong> dosyasında tutulmaktadır. <em>(Bu bir WCF kütüphanesi projesi olduğundan doğrudan çalıştırılabilir ve Web.config içerisindeki ayarlar sayesinde HTTP bazlı olarak host edilir. Diğer taraftan test etmek için <strong>WcfTestClient</strong> aracından kolayca yararlanılabilir.)</em></p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_FirstScreen.gif" alt="" /></p>
<p>Biz tabiki bu içerik yerine kendi <strong>Workflow Service</strong> örneğimizi kullanacağız. Ama öncesinde <strong>ReceiveRequest</strong> ve <strong>SendResponse </strong>isimli bileşenlerin ne işe yaradıklarını kısaca anlamaya çalışmakta yarar vardır. <strong>ReceiveRequest </strong>isimli bileşen aslında <strong>Receive </strong>tipinden bir aktivitedir. Benzer şekilde <strong>SendResponse </strong>isimli bileşende, <strong>SendReply </strong>tipinden bir aktivitedir. Tahmin edileceği üzere <strong>Receive </strong>aktivitesi ile, istemci tarafından gelen <strong>talep(Request)</strong> alınmakta ve <strong>SendReply </strong>aktivitesi yardımıylada bir <strong>cevap(Response)</strong> döndürülmektedir.<em>(Bu iki bileşen arasında ise istenen bir akışın yürütüldüğü düşünülebilir)</em> Bir başka deyişle WCF bazlı mesaj alınması ve cevap döndürülmesi amacıyla kullanılan iki aktivite tipi söz konusudur. <strong>ReceiveRequest</strong> isimli bileşen aynı zamanda istemci tarafından çağırabilecek bir operasyon sunduğundan <strong>OperationName</strong> isimli bir özelliği de sahiptir. Diğer taraftan istemci tarafından gelecek olan talep içerisindeki değişkenler <strong>Content</strong> özelliği tarafından taşınabilirler ki bu özellik aslında bir koleksiyon olarak düşünülebilir. Çünkü operasyonun birden fazla parametre alması gerekebilir. <strong>Receive</strong> aktivitesi için önem arz eden noktalardan biriside, <strong>CanCreateInstance</strong> özelliğinin değeridir. Bu değer örneğimizde <strong>true</strong> olarak set edilmiştir ve söz konusu aktiviteye bir talep gelmesi ile birlikte Workflow örneğinin oluşturulup oluşturulmayacağını işaret etmektedir. Önemli olan noktalardan biriside, <strong>SendResponse</strong> isimli bileşenin <strong>Request</strong> özelliğinin değerinin, <strong>Receive</strong> tipinden olan <strong>ReceiveRequest</strong> isimli bileşen olmasıdır. Dolayısıyla bu iki mesajlaşma aktivitesinin birbirleriyle haberleştiklerini söyleyebiliriz. <em>(İlerki yazılarımızda burada sözü edilen korelasyon konusuna değiniyor olacağız ki XAML içeriğinde bu konunun izlerini görmekteyiz.)</em></p>
<p>Bu arada <strong>Sequential Service</strong> tipinin üzerinde tanımlanmış bazı <strong>değişkenler(Variables) </strong>olduğu görülebilir.</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_Variables.gif" alt="" /></p>
<p><strong>data</strong> isimli <strong>Int32 </strong>tipinden olan değişken, <strong>Receive </strong>aktivitesi için <strong>Content</strong> değerini de temsil etmektedir. Diğer taraftan, <strong>SendReply</strong> aktivitesine ait <strong>Content</strong> özelliğinde kullanılmış ve <strong>string</strong> karşılığı üretilerek geriye döndürülmüştür. Buna göre akışın senaryosunu şu şekilde düşünebiliriz. İstemci talep olarak <strong>Int32</strong> tipinden bir değer gönderir. Bu değer <strong>ReceiveRequest</strong> isimli aktivite bileşeni tarafından alınır ve üst aktivitesi olan <strong>Sequential Service'</strong> in <strong>data</strong> değişkenine atanır. Bu değişken <strong>SendResponse</strong> isimli aktivite bileşeninin de ulaşabileceği kapsamda(Scope) olduğundan, istemciye geriye gönderilecek cevabın içeriğinde kullanılabilir. Şimdi bu bilgilerden yola çıkarak kendi <strong>Workflow Servisimizi</strong> oluşturalım.</p>
<p>Örnek olarak istemciden gelen iki sayının toplamını bulup geriye bu sonucu döndürecek bir Workflow Servis geliştirmeyi planlayabiliriz. Böylece <strong>XAML</strong> içeriğini anlamamız daha kolay olacaktır. Bu amaçla projemize yeni bir <strong>Declerative Sequential Service </strong>öğesi ekleyerek devam edebiliriz.</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_NewService.gif" alt="" /></p>
<p>MathService.xamlx servisinin tasarım görüntüsü aşağıdaki gibidir.</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_MathServiceDsgn.gif" alt="" /></p>
<p>Aslında global seviyede tanımladığımız GlobalX ve GlobalY isimli iki değişken haricinde çok fazla detay görülmemektedir. Bu nedenle konuyu anlamanın en iyi yolu XAML içeriğine bakmamız olacaktır(Zaten ilerleyen zamanlarda bu blog girişinin destekleyici görsel videosunuda yayınlıyor olacağım) İşte MathService.xamlx içeriği;</p>
<p><Service mc:Ignorable="sad1" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/servicemodel" xmlns:a="clr-namespace:AdventureServices;assembly=AdventureServices" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:p="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:p1="http://adventure/" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger; assembly=System.Activities" xmlns:sad1="http://schemas.microsoft.com/netfx/2009/xaml/activities/design" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sd1="clr-namespace:System.Data;assembly=System.Data.DataSetExtensions" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><br /> <strong><WorkflowServiceImplementation ConfigurationName="MathService" Name="MathService"><br /></strong> <strong><p:Sequence DisplayName="Basic Math Service" </strong>sad:XamlDebuggerXmlReader.FileName="C:\My Dot Net World\Projects\2010\WCF\AdventureWFServices\AdventureWFServices\MathService.xamlx" sad1:VirtualizedContainerService.HintSize="303,348.553333333333" mva:VisualBasic.Settings="Assembly references and imported namespaces serialized as XML namespaces"><br /> <strong><p:Sequence.Variables></strong><br /> <p:Variable x:TypeArguments="CorrelationHandle" Name="handle" /><br /> <strong><p:Variable x:TypeArguments="x:Int32" Name="GlobalX" /></strong><br /> <strong><p:Variable x:TypeArguments="x:Int32" Name="GlobalY" /></strong><br /> <strong></p:Sequence.Variables></strong><br /> <sad1:WorkflowViewStateService.ViewState><br /> <scg3:Dictionary x:TypeArguments="x:String, x:Object"><br /> <x:Boolean x:Key="IsExpanded">True</x:Boolean><br /> </scg3:Dictionary><br /> </sad1:WorkflowViewStateService.ViewState><br /> <strong><Receive x:Name="__ReferenceID0" CanCreateInstance="True" DisplayName="Sum" </strong>sad1:VirtualizedContainerService.HintSize="257,85.2766666666667" <strong>OperationName="Sum" ServiceContractName="p1:IMathService"</strong>><br /> <Receive.CorrelatesOn><br /> <MessageQuerySet /><br /> </Receive.CorrelatesOn><br /> <Receive.CorrelationInitializers><br /> <RequestReplyCorrelationInitializer CorrelationHandle="[handle]" /><br /> </Receive.CorrelationInitializers><br /> <Receive.KnownTypes><br /> <x:Type Type="x:Int32" /><br /> </Receive.KnownTypes><br /> <strong><ReceiveParametersContent><br /></strong> <strong><p:OutArgument x:TypeArguments="x:Int32" x:Key="X">[GlobalX]</p:OutArgument><br /></strong> <strong><p:OutArgument x:TypeArguments="x:Int32" x:Key="Y">[GlobalY]</p:OutArgument></strong><br /> <strong></ReceiveParametersContent><br /></strong> <strong></Receive></strong><br /> <strong><SendReply Request="{x:Reference __ReferenceID0}" DisplayName="Sum Response" </strong>sad1:VirtualizedContainerService.HintSize="257,85.2766666666667"><br /> <strong><SendParametersContent><br /></strong> <strong><p:InArgument x:TypeArguments="x:Int32" x:Key="Result">[GlobalX + GlobalY]</p:InArgument><br /></strong> <strong></SendParametersContent></strong><br /> <strong></SendReply></strong><br /> <strong></p:Sequence></strong><br /> <strong></WorkflowServiceImplementation></strong><br /></Service></p>
<p>İlk etapta biraz korkutucu görünebilir. <img title="Sealed" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-sealed.gif" border="0" alt="Sealed" /> Ancak şu an için üzerinde duracağımız önemli noktalar <strong>Bold</strong> olarak işaretlenmiştir. <strong>Sequence.Variables</strong> elementi içerisinde 3 değişken tanımı görülmektedir. Bizim eklediklerimiz <strong>GlobalX </strong>ve <strong>GlobalY </strong>isimli <strong>int </strong>tipinden olanlardır. Bu değişkenler <strong>Sequence </strong>elementi içerisinde tanımlandıklarından, takip eden <strong>Receive </strong>ve <strong>SendReply </strong>elementleri veya gelecek başka aktiviteler tarafından ortaklaşa kullanılabilirler. <strong>Receive</strong> elementinde operasyon ile ilişkili bilgiler dışında, servisin sözleşme ismide belirtilmektedir. <strong>Receive</strong> aktivitesi için en önemli parça <strong>ReceiveParametersContent</strong> kısmıdır. Burada <strong>X </strong>ve <strong>Y </strong>isimli <strong>OutArgument</strong> tipinden argümanlar tanımlamıştır. Bu argümanlarda önemli olan kısım <strong>GlobalX</strong> ve <strong>GlobalY</strong> atamalarıdır. <strong>X </strong>ve <strong>Y </strong>aslında istemcinin çağıracağı servis operasyonunun parametreleridir. İstemciden gelen bu değerler, aktivitenin <strong>GlobalX </strong>ve<strong> GlobalY </strong>değerlerine set edilmektedir. <strong>SendReply</strong> aktivitesi içerisinde yer alan <strong>SendParametersContent </strong>kısmında ise <strong>InArgument </strong>tipinden bir argüman tanımlanmıştır. Result ismi ile tanımlanan bu argümanın içeriği, GlobalX ve GlobalY değerlerinin toplamından oluşmaktadır. Bir başka deyişle istemci tarafına döndürelecek cevap içeriği belirlenmiş olur. İçeriğin tipi ise <strong>TypeArguments</strong> niteliğine atanan <strong>Int32 </strong>yapısıdır. Görüldüğü üzere herhangibir kod dosyası kullanılmamıştır. Tüm işlemler XAML bazlı olaraktan tanımlanabilmektedir. Buda çalışma zamanı için önemli bir esnekliktir.</p>
<p>Oluşturduğumuz sınıf kütüphanesinin Web.config dosyasının içeriği ise son derece sadedir.</p>
<p><?xml version="1.0" encoding="utf-8" ?><br /><configuration><br /> <system.web><br /> <compilation debug="true" targetFramework="4.0" /><br /> </system.web><br /> <system.serviceModel><br /> <behaviors><br /> <serviceBehaviors><br /> <behavior><br /> <serviceDebug includeExceptionDetailInFaults="False" /><br /> <serviceMetadata httpGetEnabled="True"/><br /> </behavior><br /> </serviceBehaviors><br /> </behaviors><br /> </system.serviceModel><br /></configuration></p>
<p>Görüldüğü gibi belirli bir <strong>Endpoint</strong> tanımlaması yoktur. Ancak <strong>exception</strong> detayının gönderilmesi ve <strong>Metadata</strong> bilgisinin elde edilebilmesi için gerekli <strong>davranışlar(Behaviors)</strong> tanımlanmıştır. Buna göre <strong>Workflow Servisimiz</strong>, <strong>HTTP</strong> bazlı olaraktan host edilecektir. Uygulamayı <strong>F5</strong> ile başlattığımızda ve <strong>MathService.xamlx</strong> içeriğini talep ettiğimizde aşağıdaki ekran görüntüsü ile karşılaşırız.<br /><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_Runtime.gif" alt="" /></p>
<p>Görüldüğü üzere <strong>WSDL</strong> içeriğide doğrudan talep edilebilmektedir. Buda istemciler için gerekli <strong>Proxy </strong>üretiminin kolayca yapılabileceği anlamına gelmektedir. Burada WSDL içeriğinide inceleyebiliriz. <img title="Sealed" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-sealed.gif" border="0" alt="Sealed" />Ancak benim özellikle göstermek istediğim nokta <strong>http://localhost:65193/MathService.xaml?xsd=xsd1</strong> talebinin sonucudur. Nitekim <strong>WSDL</strong> dökümanına baktığımızda, <strong>Sum</strong> isimli operasyonun kullandığı <strong>X </strong>ve <strong>Y </strong>parametrelerini göremeyiz. Ancak bu parametrelerin tanımlandığı <strong>XSD </strong>içeriğine bir referans bildirildiğini fark edebiliriz. Bu <strong>XSD</strong> içeriğinde aşağıdaki ekran görüntüsünde olduğu gibi, <strong>X,Y</strong> ile istemci tarafına döndürelecek Result değişkenlerine ait tanımlamalar yer almaktadır.</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_Xsd1.gif" alt="" /></p>
<p>Dilerseniz artık servisimizi test edelim. Bu amaçla daha önceden de belirttiğimiz gibi WcfTestClient aracını kullanabiliriz. İşte örnek bir toplama işlemi;</p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_ClientRuntime.gif" alt="" /></p>
<p>İlk olarak Request için X ve Y değerleri girilir sonrasında Invoke düğmesine tıklanır. Bir süre beklemenin ardından servisten geri dönüş elde edilir. BasicHttpBinding tabanlı olarak host edilen Workflow Servisimiz başarılı bir şekilde çalıştırılmıştır. Yapılan Invoke işlemi sonrası üretilen XML içeriğine bakıldığında ise aşağıdaki çıktının oluştuğu görülebilir. </p>
<p><img src="http://www.buraksenyurt.com/pics/2009%2f9%2fblg78_ClientXml.gif" alt="" /></p>
<p>İşte bu kadar. <img title="Smile" src="http://www.buraksenyurt.com/editors/tiny_mce3/plugins/emotions/img/smiley-smile.gif" border="0" alt="Smile" /> <strong>Workflow Servisleri</strong> sayesinde bir iş akışının servis bazlı olarak başlatılabilmesi ve <strong>WF Çalışma zamanının</strong> nimetlerinden yararlanabilmesi mümkün olmaktadır. Üstelik, <strong>.Net 4.0</strong> tarafında gelen yeni modele göre söz konusu <strong>Workflow</strong> <strong>Servislerinin </strong>tamamen <strong>XAML </strong>içeriğinden oluşacak şekilde <strong>dekleratif </strong>olarak tanımlanabilmesi söz konusudur. Bu da çalışma zamanında koda müdahale etmeye gerek duymadan akış ile ilişkili bazı değişikliklerin yapılabileceğinin bir göstergesidir. Bakalım WCF&WF kardeşliğinde başka ne gibi yenilikler bizleri bekliyor. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="http://www.buraksenyurt.com/pics/2009%2f9%2fAdventureWFServices.rar">AdventureWFServices.rar (442,66 kb)</a></p>2009-10-19T13:22:00+00:00wcfwcf 4.0wfwf 4.0bsenyurthttps://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=6ea1de50-6f31-4c84-a781-03fd5e938fd42https://www.buraksenyurt.com/trackback.axd?id=6ea1de50-6f31-4c84-a781-03fd5e938fd4https://www.buraksenyurt.com/post/WCF-40-Yenilikleri-Workflow-Services#commenthttps://www.buraksenyurt.com/syndication.axd?post=6ea1de50-6f31-4c84-a781-03fd5e938fd4