• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 23.04.2016 00:55:33C programlama 2 oyun
  • 20.04.2016 16:34:41Local Database
  • 15.04.2016 14:26:15Fatura kayıt işlemi
  • 21.03.2016 01:55:30C# problem

Popüler Sorular

  • 27.05.2012 05:49:50Asp.Net ile Date time alana veri ekleyemiiyorum ?
  • 2.04.2012 00:45:18.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 12.05.2012 08:44:49Acil Yardım
  • 27.05.2012 13:46:51veri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LINQ
  • LibreOffice
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

WCF 4.0 Yenilikleri - Workflow Services [Beta 2]

WCF ve WF arasında ilişkiyi anlatan güzel bir cümle vardır. .Net Framework 3.0' da arkadaş olan WCF ve WF, .Net Framework 3.5 sürümünde nişanlanmış, .Net Framework 4.0 sürümünde ise evlenmişlerdir.

01.01.2013

Yazar: Burak Selim Şenyurt (Google+)

Kategori: WCF

3315

Merhaba Arkadaşlar,

WCF ve WF arasında ilişkiyi anlatan güzel bir cümle vardır. .Net Framework 3.0' da arkadaş olan WCF ve WF, .Net Framework 3.5 sürümünde nişanlanmış, .Net Framework 4.0 sürümünde ise evlenmişlerdir. Wink Bu ikilinin bir arada ele alınması sonucu Workflow Services adı verilen bir ufaklıkta ortaya çıkmıştır. Aslında bir akışın servis bazlı olması son derece önemlidir. Nitekim WF tarafında, uzun süreli işlemlerin ele alınması(Long Running Process), akışın çeşitli noktalarından farklı anlar için kalıcı olarak saklanabilmesi(Persistence), asenkron çalışma zamanı motorunun zaten hazır olarak bulunması söz konusudur. Bu özelliklerin WCF Servis Noktaları(Endpoints) 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 WCF 3.5 sürümünde de gerçeklenebilmektedir. Ne varki, WCF 4.0 tarafında tamamen declerative olarak tanımlanabilen ve saf XAML(eXtensible Application Markup Language) içeriğinden oluşan bir Workflow Servisinin geliştirilebilmesi mümkündür. Üstelik Visual Studio 2010 WF Designer sayesinde bu XAML içeriğinin üretilmesi için IDE desteği de sunulmaktadır.

Kişisel Not : Windows XP, Vista ve 7 sürümlerinde kullandığım Visual Studio 2010 Beta 1 ürününde, WF Designer sürekli olarak hata verip IDE' yi Restart işlemine zorlamaktaydı.Undecided Neyseki bu sorun Visual Studio 2010 Beta 2 sürümünde ortadan kaldırılmış durumdadır.Wink

Dolayısıyla bu yazımızın konusu şimdiden belli oldu. Çok basit ve büyük ihtimalle pek işe yaramayan bir Workflow Service' in nasıl geliştirilebileceğini incelemeye çalışıyor olacağız. İşe ilk olarak Declerative Sequential Service Library tipinden bir WCF projesi oluşturarak başlayacağız. Aşağıdaki ekran görüntüsünde olduğu gibi.

Örnek olarak AdventureWFServices ismiyle oluşturduğumuz projede Service1.Xamlx dosyası hemen dikkati çekmektedir. Bu örnek olarak oluşturulan Workflow Service örneğidir. Yani Microsoft tarafından sunulan hazır Hello World örneği Wink Tamamen XAML içeriğinden oluşmaktadır ve istemcilere servis olarak nasıl sunulacağına ilişkin çalışma zamanı bilgileri(WCF Servis konfigurasyon bilgileri) Web.config dosyasında tutulmaktadır. (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 WcfTestClient aracından kolayca yararlanılabilir.)

Biz tabiki bu içerik yerine kendi Workflow Service örneğimizi kullanacağız. Ama öncesinde ReceiveRequest ve SendResponse isimli bileşenlerin ne işe yaradıklarını kısaca anlamaya çalışmakta yarar vardır. ReceiveRequest isimli bileşen aslında Receive tipinden bir aktivitedir. Benzer şekilde SendResponse isimli bileşende, SendReply tipinden bir aktivitedir. Tahmin edileceği üzere Receive aktivitesi ile, istemci tarafından gelen talep(Request) alınmakta ve SendReply aktivitesi yardımıylada bir cevap(Response) döndürülmektedir.(Bu iki bileşen arasında ise istenen bir akışın yürütüldüğü düşünülebilir) 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. ReceiveRequest isimli bileşen aynı zamanda istemci tarafından çağırabilecek bir operasyon sunduğundan OperationName isimli bir özelliği de sahiptir. Diğer taraftan istemci tarafından gelecek olan talep içerisindeki değişkenler Content özelliği tarafından taşınabilirler ki bu özellik aslında bir koleksiyon olarak düşünülebilir. Çünkü operasyonun birden fazla parametre alması gerekebilir. Receive aktivitesi için önem arz eden noktalardan biriside, CanCreateInstance özelliğinin değeridir. Bu değer örneğimizde true 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, SendResponse isimli bileşenin Request özelliğinin değerinin, Receive tipinden olan ReceiveRequest isimli bileşen olmasıdır. Dolayısıyla bu iki mesajlaşma aktivitesinin birbirleriyle haberleştiklerini söyleyebiliriz. (İ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.)

Bu arada Sequential Service tipinin üzerinde tanımlanmış bazı değişkenler(Variables) olduğu görülebilir.

data isimli Int32 tipinden olan değişken, Receive aktivitesi için Content değerini de temsil etmektedir. Diğer taraftan, SendReply aktivitesine ait Content özelliğinde kullanılmış ve string karşılığı üretilerek geriye döndürülmüştür. Buna göre akışın senaryosunu şu şekilde düşünebiliriz. İstemci talep olarak Int32 tipinden bir değer gönderir. Bu değer ReceiveRequest isimli aktivite bileşeni tarafından alınır ve üst aktivitesi olan Sequential Service' in data değişkenine atanır. Bu değişken SendResponse 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 Workflow Servisimizi oluşturalım.

Ö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 XAML içeriğini anlamamız daha kolay olacaktır. Bu amaçla projemize yeni bir Declerative Sequential Service öğesi ekleyerek devam edebiliriz.

MathService.xamlx servisinin tasarım görüntüsü aşağıdaki gibidir.

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;

<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">
  <WorkflowServiceImplementation ConfigurationName="MathService" Name="MathService">
    <p:Sequence DisplayName="Basic Math Service" 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">
      <p:Sequence.Variables>
        <p:Variable x:TypeArguments="CorrelationHandle" Name="handle" />
        <p:Variable x:TypeArguments="x:Int32" Name="GlobalX" />
        <p:Variable x:TypeArguments="x:Int32" Name="GlobalY" />
      </p:Sequence.Variables>
      <sad1:WorkflowViewStateService.ViewState>
        <scg3:Dictionary x:TypeArguments="x:String, x:Object">
          <x:Boolean x:Key="IsExpanded">True</x:Boolean>
        </scg3:Dictionary>
      </sad1:WorkflowViewStateService.ViewState>
      <Receive x:Name="__ReferenceID0" CanCreateInstance="True" DisplayName="Sum" sad1:VirtualizedContainerService.HintSize="257,85.2766666666667" OperationName="Sum" ServiceContractName="p1:IMathService">
        <Receive.CorrelatesOn>
          <MessageQuerySet />
        </Receive.CorrelatesOn>
        <Receive.CorrelationInitializers>
          <RequestReplyCorrelationInitializer CorrelationHandle="[handle]" />
        </Receive.CorrelationInitializers>
        <Receive.KnownTypes>
          <x:Type Type="x:Int32" />
        </Receive.KnownTypes>
        <ReceiveParametersContent>
          <p:OutArgument x:TypeArguments="x:Int32" x:Key="X">[GlobalX]</p:OutArgument>
          <p:OutArgument x:TypeArguments="x:Int32" x:Key="Y">[GlobalY]</p:OutArgument>
        </ReceiveParametersContent>
      </Receive>
      <SendReply Request="{x:Reference __ReferenceID0}" DisplayName="Sum Response" sad1:VirtualizedContainerService.HintSize="257,85.2766666666667">
        <SendParametersContent>
          <p:InArgument x:TypeArguments="x:Int32" x:Key="Result">[GlobalX + GlobalY]</p:InArgument>
        </SendParametersContent>
      </SendReply>
    </p:Sequence>
  </WorkflowServiceImplementation>
</Service>

İlk etapta biraz korkutucu görünebilir. Sealed Ancak şu an için üzerinde duracağımız önemli noktalar Bold olarak işaretlenmiştir. Sequence.Variables elementi içerisinde 3 değişken tanımı görülmektedir. Bizim eklediklerimiz GlobalX ve GlobalY isimli int tipinden olanlardır. Bu değişkenler Sequence elementi içerisinde tanımlandıklarından, takip eden Receive ve SendReply elementleri veya gelecek başka aktiviteler tarafından ortaklaşa kullanılabilirler. Receive elementinde operasyon ile ilişkili bilgiler dışında, servisin sözleşme ismide belirtilmektedir. Receive aktivitesi için en önemli parça ReceiveParametersContent kısmıdır. Burada X ve Y isimli OutArgument tipinden argümanlar tanımlamıştır. Bu argümanlarda önemli olan kısım GlobalX ve GlobalY atamalarıdır. X ve Y aslında istemcinin çağıracağı servis operasyonunun parametreleridir. İstemciden gelen bu değerler, aktivitenin GlobalX ve GlobalY değerlerine set edilmektedir. SendReply aktivitesi içerisinde yer alan SendParametersContent kısmında ise InArgument 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 TypeArguments niteliğine atanan Int32 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.

Oluşturduğumuz sınıf kütüphanesinin Web.config dosyasının içeriği ise son derece sadedir.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Görüldüğü gibi belirli bir Endpoint tanımlaması yoktur. Ancak exception detayının gönderilmesi ve Metadata bilgisinin elde edilebilmesi için gerekli davranışlar(Behaviors) tanımlanmıştır. Buna göre Workflow Servisimiz, HTTP bazlı olaraktan host edilecektir. Uygulamayı F5 ile başlattığımızda ve MathService.xamlx içeriğini talep ettiğimizde aşağıdaki ekran görüntüsü ile karşılaşırız.

Görüldüğü üzere WSDL içeriğide doğrudan talep edilebilmektedir. Buda istemciler için gerekli Proxy üretiminin kolayca yapılabileceği anlamına gelmektedir. Burada WSDL içeriğinide inceleyebiliriz. SealedAncak benim özellikle göstermek istediğim nokta http://localhost:65193/MathService.xaml?xsd=xsd1 talebinin sonucudur. Nitekim WSDL dökümanına baktığımızda, Sum isimli operasyonun kullandığı X ve Y parametrelerini göremeyiz. Ancak bu parametrelerin tanımlandığı XSD içeriğine bir referans bildirildiğini fark edebiliriz. Bu XSD içeriğinde aşağıdaki ekran görüntüsünde olduğu gibi, X,Y ile istemci tarafına döndürelecek Result değişkenlerine ait tanımlamalar yer almaktadır.

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;

İ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. 

İşte bu kadar. Smile Workflow Servisleri sayesinde bir iş akışının servis bazlı olarak başlatılabilmesi ve WF Çalışma zamanının nimetlerinden yararlanabilmesi mümkün olmaktadır. Üstelik, .Net 4.0 tarafında gelen yeni modele göre söz konusu Workflow Servislerinin tamamen XAML içeriğinden oluşacak şekilde dekleratif 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.

AdventureWFServices.rar (442,66 kb)

Yazar Hakkında

Burak Selim Şenyurt

Burak Selim Şenyurt

buraksenyurt.com

Yıldız Teknik Üniversitesi Matematik Mühendisliği mezunu olan Şenyurt, 1999 yılında profesyonel olarak adım attığı yazılım dünyasında, 2003 yılından beri Microsoft .Net teknolojileri ile ilgilenmektedir. Yazılım hayatına Assist Line isimli Call Center firmasında Delphi programcısı olarak başlayan Şenyurt sonrasında, sırasıyla Bizitek(Junior Developer), Netron(Master Trainer), Citibank(Outsource Senior Software Developer), Innova(Application Development Consultant), ve TCM(Software Architect) firmalarında görev almıştır. Su anda ING Bank bünyesinde Kıdemli Yazılım Danışmanı olarak görev yapmaktadir. 2006, 2007 yıllarında C#, 2008,2009,2010 yıllarında ise Connected System Developer kategorisinde Microsoft MVP seçilen Şenyurt, evli ve 1 çocuk babasıdır. C# diline olan düşkünlüğü, oğluna S(h)arp adının verilmesinde önemli bir etken olmustur.

Sosyal Medya

ORANLAR

  • 3315izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Hocam Link başka sayfaya yönlendiriyor.
  • merhaba benim merak ettiğim bir konu var y...
  • Merhaba download linki çalışmıyor. Rica et...
  • Nevzat Bey selamlar, Açıkçası bizler a...
  • Parametreleri Cache İşleminden Yalıtma kon...

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 121521
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 67179
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 49424
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ