Burak Selim Senyurt(MVP)
Matematik Mühendisi bir .NET Severin Yazıları...

Workflow Foundation Öğreniyorum - Ders 13 - Workflow Service için İstemci Geliştirmek

Cuma, 30 Temmuz 2010 13:30 by bsenyurt

Merhaba Arkadaşlar,

NedirTv?com desteğinde sürdürdüğümüz "Workflow Foundation 4.0 Öğreniyorum" görsel eğitim serimizin 14ncü dersi ile(13+1) karşınızdayız. Bir önceki dersimizde Workflow Service örneklerinin nasıl geliştirilebileceğini incelemeye çalışmıştık. Bu dersimizde ise ilk olarak, bir Workflow Service uygulamasını Internet Information Services(IIS) altına Publish ediyor olacağız. Sonrasında ise, .Net Framework 4.0 tabanlı uygulama havuzu(Application Pool) altında Host edilen bu servis için basit bir WinForms istemcisi geliştireceğiz. Bu sayede Workflow Service içerisinde yer alan iş akışı mantıklarının, servis bazlı olarak bir istemci uygulama tarafından nasıl kullanılabileceğini de anlayacağız. Geliştireceğimiz istemci tarafında otomatik olarak üretilen proxy tipini kullanacak ve ilgili servis operasyonları için hem senkron hemde asenkron çağrıların nasıl tasarlanabileceğini öğreneceğiz. İyi seyirler dilerim.

Ders 13 - Workflow Service için İstemci Geliştirmek

Süre : 23:55

Dosya Boyutu : 32.3 Mb

Örnek : Lesson13.rar (84,97 kb)

Mp4 Formatında İndirmek İçin Tıklayın

NedirTv?com Yeni Arayüzü ile Yayında

Cuma, 23 Temmuz 2010 20:45 by bsenyurt

blg217_Giris

Merhaba Arkadaşlar,

Yaklaşık 2 hafta önce NedirTv?com’ u yeni arayüzü ile yayına aldık. Laughing Daha kullanışlı ve hızlı arayüzümüzle daha fazla yazılımcıya ulaşmayı umuyoruz.

Yeni arayüzü hazırlayıp kodlayan ve bu iş için büyük emek harcayan Alper Özçetin ile Alp Çoker' e de teşekkürlerimizi iletiyoruz. Ayrıca Daron Yöndem ve Muammer Benzeş' e de yardımlarından dolayı müteşekkiriz.

NedirTv?com ailesi ve değerli takipçilerine hayırlı olması dileğiyle hepinize mutlu seyirler.

Workflow Foundation Öğreniyorum - Ders 12 - Workflow Service Geliştirmek

Cuma, 23 Temmuz 2010 09:30 by bsenyurt

Merhaba Arkadaşlar,

NedirTv?com sponsorluğunda devam ettirdiğimiz "Workflow Foundation 4.0 Öğreniyorum" serimizin on üçüncü(12+1) dersi ile karşınızdayız. Bu dersimizde Workflow örneklerinin servis bazlı olarak dış dünyaya nasıl sunulabileceklerini incelemeye çalışıyor olacağız. Bir başka deyişle Workflow Service örneklerini irdeleyeceğiz.

WCF Eco System' in de önemli bir parçası olan ve doğal olarak Windows Communication Foundation alt yapısı üzerinde konuşlandırılan Workflow Service' ler sayesinde, iş akışlarını servis olarak istemcilere açmamız mümkün hale gelmektedir. İlk dersimizde Asp.Net Development Server üzerinden WcfTestClient aracı yardımıyla test edeceğimiz Workflow Service' lerini, ilerleyen derslerimizde IIS(Internet Information Services) ortamı üzerinden yayınlayarak daha geniş bir dünyaya adım atmaya çalışıyor olacağız. Şimdilik ilk bebek adımımız atalım da sonradan gerisi gelir Wink

Ders 12 - Workflow Service Geliştirmek

Süre : 24:41

Dosya Boyutu : 32.8 Mb

Örnek : Lesson12.rar (15,41 kb)

Mp4 Formatında İndirmek İçin Tıklayın

Silverlight Tarafından Feed Okumak

Perşembe, 22 Temmuz 2010 18:05 by bsenyurt

Merhaba Arkadaşlar,

Yeni bir maceraya hazır mısınız? Hureyyy dediğinizi duyar gibiyim. Bildiğiniz üzere Internet kaynaklarının takibinin kolay bir şekilde yapılabilmesi adına RSS veya Atom formatındaki Feed içeriklerinden sıklıkla yararlanmaktayız. Blog, Community, News Group ve benzeri pek çok internet kaynağı, güncel içeriklerini yayınlamak amacıyla global olarak standart hale getirilmiş olan bu formatları kullanmaktalar. Pek tabi yayınlanan bu içeriklerin takip edilebilmesi içinde çeşitli istemci programlar söz konusu. FeedReader bu uygulamalara örnek olarak verilebilecek Windows tabanlı iddialı programlardan birisi. Feed içerikleri zaman zaman internet siteleri üzerinde kontrol şeklinde de barındırılmaktadır. Söz gelimi pek çok blog içerisinde bu durum söz konusudur ve hatta hazır Widget' lar yardımıyla entegrasyonları son derece kolaydır. Peki maceramız nerede başlıyor? Özellikle ambulans resminin bu konu ile alakası nedir? Sealed

Doğruyu söylemek gerekirse sıkıldığım bir ara ne yapayım diye düşünürken Silverlight 4.0 tabanlı olarak geliştirilen bir uygulamadan RSS içeriklerini nasıl okuyabileceğimi düşünmeye başladım. Daha önceden HTTP bazlı Get,Post,Put, Delete metodlarınaa cevap veren WCF tabanlı servislerin tüketilmesi için WebClient tipinden nasıl yararlanıldığını incelemiştim(Silverlight Tarafında HTTP Bazli Servisleri Kullanmak isimli yazıyı incelemenizi öneririm) Yine aynı şekilde devam ederek herhangibir RSS içeriğini örnek Silverlight uygulamama taşıyabileceğimi düşünerek kolları sıvadım ve heyecanlı bir şekilde aşağıdaki ekran görüntüsü ve XAML içeriğine sahip kontrolü oluşturdum.

XAML içeriği;

<UserControl x:Class="RSSReaderim.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="337" d:DesignWidth="394" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="RSS Oku" Height="23" HorizontalAlignment="Left" Margin="313,76,0,0" Name="ReadRSSButton" VerticalAlignment="Top" Width="75" Click="ReadRSSButton_Click" />
        <sdk:Label Height="29" HorizontalAlignment="Left" Margin="8,12,0,0" Name="label1" VerticalAlignment="Top" Width="69" Content="RSS Adresi" FontSize="10" />
        <ListBox Height="180" HorizontalAlignment="Left" Margin="6,105,0,0" Name="RSSListBox" VerticalAlignment="Top" Width="382" ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Title.Text}" Foreground="BlueViolet" />
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="8,47,0,0" Name="RSSTextBox" VerticalAlignment="Top" Width="380" />
        <sdk:Label Height="40" HorizontalAlignment="Left" Margin="8,297,0,0" Name="RSSInfoLabel" VerticalAlignment="Top" Width="380" FontSize="9" />
    </Grid>
</UserControl>

Aslında teori son derece basitti. Kullanıcı TextBox kontrolü üzerinden bir RSS adresi girecekti. Sonra düğmeye basarak içeriğin ListBox kontrolüne dolmasını seyredecekti. Son derece basit ve masumane bir talep öyle değil mi? Undecided Tabi bu işlemler için kod tarafını da, heyecanlı bir şekilde aşağıdaki gibi geliştirmeye çalıştım.

using System;
using System.Net;
using System.ServiceModel.Syndication;
using System.Windows;
using System.Windows.Controls;
using System.Xml;

namespace RSSReaderim
{
    public partial class MainPage : UserControl
    {
        WebClient client;

        public MainPage()
        {
            InitializeComponent();
            // WebClient nesnesi örneklenir
            client = new WebClient();
            // RSS Adresinden okuma işlemi tamamlanınca devreye girecek olan olay metodu yüklenir
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);
        }

        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            if (e.Error == null) // Eğer okuma işlemi sırasında bir hata oluşmadıysa
            {
                // RSS bilgisi e.Result üzerinden Stream şeklinde elde edilir ve XmlReader nesnesinin örneklenmesi için kullanılır. Bu gereklidir nitekim SyndicationFeed.Load metodu XmlReader tipi ile çalışmaktadır.
                XmlReader xReader = XmlReader.Create(e.Result);
                // System.ServiceModel.Syndication.dll Assembly' ının projeye referans edilmesi gerekmektedir.
                SyndicationFeed feed = SyndicationFeed.Load(xReader);
                // Items koleksiyonu ListBox bileşenine veri kaynağı olarak bağlanır
                RSSListBox.ItemsSource = feed.Items;
            }
            else if(e.Error!=null)
            {
                // Bir hata oluştuysa istisna mesajını Label kontrolünde göster
                RSSInfoLabel.Content = String.Format("Bir Sorun oluştu. {0}", e.Error);
            }
        }

        private void ReadRSSButton_Click(object sender, RoutedEventArgs e)
        {           
            // Okuma işlemini başlat.
            // Örnek RSS Adresi : http://www.buraksenyurt.com/syndication.axd?format=rss
            if (!String.IsNullOrEmpty(RSSTextBox.Text))
                client.OpenReadAsync(new Uri(RSSTextBox.Text));
            else
                RSSInfoLabel.Content = "Lütfen bir RSS Adresi giriniz";
        }
    }
}

Kod parçasından da görüldüğü üzere WebClient tipini kullanarak TextBox kontrolüne girilen adres için bir talepte bulunulmaktadır. Söz konusu talepin sonucu elde edildiğinde devreye giren olay metodu içerisinde ise, öncelikli olarak bir hata kontrolü yapılmaktadır. Eğer herhangibir hata söz konusu değilse SyndicationFeed tipinden yararlanılarak elde edilen Stream referansının Feed olarak ele alınabilmesi amacıyla gerekli işlemler yapılmaktadır. Son olarak söz konusu içerik nesnesi üzerinden ulaşılan Items koleksiyonu, ListBox kontrolüne bağlanır.

Şimdi blog girdimizin başında yer alan resmi açıklayalım. Bu kadar süratli araba kullanırsanız duvara toslamanız an meselesi olabilir. Aynen örneğimizde şu an tosladığımız gibi Undecided İşte duvara tosladığımız anda saniyenin milyonda birinde şişen hava yastığı içinden fırlayan Exception mesajımız.

Hayda breeeee!!! Surprised İşte hızlı gitmenin doğal sonucu.

Aslında gözden kaçırdığımız çok önemli bir durum söz konusu. O da Silverlight tarafında önem arz eden konuların başında gelen Cross-Domain Policy vakası. Sonuç itibariyle RSS çıktısı için talepte bulunduğumuz Domain adresi ile örneği geliştirmekte olduğumuz Asp.Net Development Server' ın port numarası eşliğine açtığı Domain adresleri birbirlerinden farklı. Bu sebepten sunucu tarafının bir ClientAccessPolicy.xml dosyasına sahip olması ve içerisinde söz konusu talepler için gerekli garanti haklarını belirtmiş olması şart. Ancak bu senaryoya göre Silverlight istemcileri için Cross-Domain Policy desteği vermeyen hiç bir sunucudan RSS içeriğini okumamız mümkün değil. Peki öyleyse ne yapacağız? Çözüm olarak biraz dolambaçlı bir yol olsa da, aşağıdaki şekilde görülen planı izleyebiliriz.

Biliyoruz ki, Silverlight uygulamaları Asp.Net gibi Web uygulamaları içerisinde host edilebilmektedir. Planımıza göre Cross-Domain Policy sorunu ile karşılaşmayacak olan WCF Service' lerinin, Silverlight istemcilerinin talep edeceği RSS içeriklerini ele alması söz konusudur. Buna göre Silverlight istemcileri, RSS çıktılarına doğrudan talepte bulunmak yerine söz konusu taleplerini önce arada Proxy görevini üstlenen bir WCF servisine iletecektir. Bu WCF servisi, ilgili adres bilgisini alarak Feed çıktısını talep edecek ve elde ettiği içeriği tekrardan Silverlight tarafına gönderecektir. Şekildeki plana göre 1 ve 2 numaralı iki adet WCF servisi söz konusudur. Bunlardan hangisinin seçileceği tamamen tercihe bağlıdır. İstersek Silverlight uygulaması ile aynı Domain içerisinde yer alan bir WCF servisini, istersek IIS üzerinde konuşlandırılan ayrı bir WCF servisini kullanabiliriz. Tabi IIS üzerinde host edilen bir WCF Servisi söz konusu ise, Silverlight istemcisi ile olan iletişiminin güvenlik sorununa takılmaması için ClientAccessPolicy.xml kullanılması gerekecektir. Tercih tamamen geliştiriciye bağlıdır. Ancak aynı Web sunucusu üzerinde yer alan birden fazla Silverlight istemcisi söz konusu ise ilgili servisin IIS altında konuşlandırılması daha çok tercih edilebilir.

Not : Bu noktada hazır olarak Siverlight istemcilerine hizmette bulunabilen Feed servislerinden de yararlanabileceğimizi belirtmek isterim. Reading data and RSS with Silverlight and no cross-domain policy başlıklı yazıda Tim Heuer söz konusu servislerden bahsetmektedir.

Ben örneğimizde hız kesemeden devam edebilmek adına, aynı uygulamaya Silverlight destekli bir WCF servisini ekleyerek ilerlemeyi tercih ettim. İşte FeedReaderService isimli Silverlight servisinin kod içeriği.

Not : Silverlight destekli WCF Servicelerinin nasıl geliştirileceğini Screencast - Silverlight Enabled WCF Services isimli görsel dersten takip edebilirsiniz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Syndication;
using System.Web.Services.Protocols;
using System.Xml;

namespace RSSReaderim.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class FeedReaderService
    {
        [OperationContract]
        public List<SyndItem> ReadRss(string address)
        {
            List<SyndItem> feedItems = null;          
            try
            {
                // XmlReader.Create metodu parametre olarak address bilgisini almaktadır. Elde edilen Xml içeriği Load metodu yardımıyla çekilir ve SyndicationItem tipinden olan Items koleksiyonu çekilir.               
                var syndicationItems =SyndicationFeed.Load(XmlReader.Create(address)).Items;
                // SyndicationItem örneklerinin her biri ele alınıp yeni bir SyndItem örneklenmesinde kullanılır.
                feedItems = (from syndicationItem in syndicationItems
                             select new SyndItem
                             {
                                 Title = syndicationItem.Title.Text,
                                 PublishDate = syndicationItem.PublishDate.DateTime,
                                 Summary = syndicationItem.Summary.Text,
                                 Link=syndicationItem.Links[0].Uri
                             }
                           ).ToList();
            }
            catch(Exception excp)
            {
                throw new SoapException("Bir hata oluştu", new XmlQualifiedName("RssReadError"), excp);
            }
            return feedItems;
        }
    }

    // SyndicationItem tipi serileştirme sorununa neden olduğundan araya bir Surrogate tip alınmıştır. Bu tip içerisinde Silverlight tarafı için gerekli temel Feed bilgileri yer almaktadır.
    public class SyndItem
    {
        public string Title { get; set; }
        public DateTime PublishDate { get; set; }
        public string Summary { get; set; }
        public Uri Link { get; set; }
        //TODO: Diğer bilgilerde getirilmelidir. Örneği yazar bilgisi, son güncellenme tarihi veya kategoriler.
    }
}

Servis kodunda dikkat edilmesi gereken en önemli noktalardan birisi, ReadRss metodunun geriye SyndItem tipinden generic bir List koleksiyonu döndürmesidir. Bu noktada akla şu soru gelebilir. Neden List<SyndicationItem> gibi bir koleksiyon döndürmüyoruz? Wink Aslında buradaki sorun SyndicationItem tipinin serileştirme işlemi sırasında çalışma zamanı hatasına neden olmasıdır. Serileştirmedeki bu sıkıntı bizi alternatif bir yola itmiştir. Bu sebepten örnekte bir Surrogate tip kullanılmaktadır. Bu işlemin ardından artık Silverlight tarafı için gerekli geliştirmeler yapılabilir. İlk etapta aynı Domain içerisindeki(bir başka deyişle aynı Solution içerisindeki) WCF Servisinin Silverlight projesine eklenmesi gerekmektedir.

Sonrasında ise istemci tarafı için gerekli kodlar yazılabilir. Yeni örnekte XAML içeriği de aşağıdaki gibi düzenlenmiştir.

<UserControl x:Class="RSSReaderim.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="337" d:DesignWidth="394" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="RSS Oku" Height="23" HorizontalAlignment="Left" Margin="313,76,0,0" Name="ReadRSSButton" VerticalAlignment="Top" Width="75" Click="ReadRSSButton_Click" />
        <sdk:Label Height="29" HorizontalAlignment="Left" Margin="8,12,0,0" Name="label1" VerticalAlignment="Top" Width="69" Content="RSS Adresi" FontSize="10" />
        <ListBox Height="180" HorizontalAlignment="Left" Margin="6,105,0,0" Name="RSSListBox" VerticalAlignment="Top" Width="382" ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical" Margin="2" Background="Black">
                        <TextBlock Text="{Binding Title}" Foreground="Gold" />
                        <TextBlock Text="{Binding Link}" Foreground="LightCyan" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="8,47,0,0" Name="RSSTextBox" VerticalAlignment="Top" Width="380" />
        <sdk:Label Height="40" HorizontalAlignment="Left" Margin="8,297,0,0" Name="RSSInfoLabel" VerticalAlignment="Top" Width="380" FontSize="9" />
    </Grid>
</UserControl>

Bu kez ListBox.ItemTemplate içerisinde hem Title hemde Link bilgilerinin gösterilmesi sağlanmıştır. Yeni örnekte SnydItem isimli bir Surrogate tip söz konusu olduğundan ve bu tipin Title özelliği String tipten tanımlandığından, bir önceki XAML kodunda yer alan {Binding Title.Text} eşitlemesi kullanılmamalıdır. Gelelim kodlarımıza;

using System;
using System.Windows;
using System.Windows.Controls;
using RSSReaderim.FeedReaderServiceSpace;

namespace RSSReaderim
{
    public partial class MainPage : UserControl
    {
        FeedReaderServiceClient client = null;
        public MainPage()
        {
            InitializeComponent();
            client = new FeedReaderServiceClient();
            client.ReadRssCompleted += new EventHandler<ReadRssCompletedEventArgs>(client_ReadRssCompleted);
        }

        private void ReadRSSButton_Click(object sender, RoutedEventArgs e)
        {
            client.ReadRssAsync(RSSTextBox.Text);
        }
        void client_ReadRssCompleted(object sender, ReadRssCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                RSSInfoLabel.Content = e.Error;
            }
            else if (e.Cancelled)
            {
                RSSInfoLabel.Content = "İşlem iptal edildi";
            }
            else
            {
                RSSListBox.ItemsSource = e.Result;
            }           
        }
    }
}

Kod içeriğinden de görüldüğü üzere WCF servisine ait Proxy tipinden yararlanılarak Feed içeriğinin asenkron olarak ortama çekilmesi işlemi gerçekleştirilmektedir. İşte örnek çalışma zamanı çıktılarından birisi.

ve diğer bir örnek;

Görüldüğü üzere RSS içerikleri başarılı bir şekilde getirilebilmektedir. Elbetteki örnekte eksik olan bir çok kısım vardır. Söz gelimi RSS ile ilişkili olarak daha çok verinin getirilmesi daha iyi olacaktır. Söz gelimi Feed' in sahibi olan siteye ait bilgiler. Diğer yandan eksik kalan önemli noktalardan biriside ListBox' ta bir öğe seçildiğinde ilgili Feed adresine nasıl gidileceğidir. Sonuç itibariyle Silverlight uygulaması tarayıcı üzerinde çalışmaktadır ve ilgili Feed içeriğinin Content verisinin gösterilmesini herkes isteyecektir. İşte size güzel bir araştırma konusu ve ödev Smile Benden buraya kadar. Bir süre dinlenmeye çalışacağım. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

RSSReaderim_RTM.rar (1,48 mb)[Örnek Visual Studio 2010 Ultimate RTM sürümünde geliştirilmiş ve test edilmiştir]

Microsoft Teknoloji Günleri Akşam Sınıfı – Gün 3 – WCF ile Servis Yaklaşımı Eğitimi Tamamlandı

Çarşamba, 21 Temmuz 2010 02:45 by bsenyurt

IMG_3578

Merhaba Arkadaşlar,

25 Mayıs 2010 Tarihinde C# 4.0 ile birlikte gelen yenilikleri anlatarak başladığımız Microsoft Teknoloji Günleri Akşam Sınıfının üçüncü gününü de kazasız belasız tamamladık. Öncelikli olarak tüm katılımcılarımızın ayağına sağlık.

Eğitimin video kayıtlarının alınması noktasında yardımcı olan Mustafa Demirhan’a, kameranın kapasitesi dolunca yardıma koşarak kendi kamerası ile çekim yapan Microsoft Student Partner(MSP) adayı Burak Özkan’a, şu anda okumakta olduğunuz blog yazısındaki resimler gibi kaliteli, yüksek çözünürlüklü sayısız fotoğraf çekerek bizle paylaşan Tuba Çebi’ ye, Akşam Sınıfı fikrinin olgunlaşmasında en büyük yardımcım olan ve özellikle katılımcıları aşağıdaki resimde olduğu gibi hediyeler ile mutlu etmemizi sağlayan Buket Şerefli’ ye(Microsoft Türkiye İş Ortağı Yöneticisi) canı gönülden teşekkür etmek istiyorum.

IMG_3582

Buket Şerefli tarafından temin edilen hediyeler arasında bulunan Yeşil Vista Logolu Havlu’ sunu, kazanan değerli katılımcımıza hediye ederken.

IMG_3761

Microsoft Certified Partner logolu duvar saatlerinden birisini, kazanan değerli katılımcımıza hediye ederken.

Eğitimde çok güzel bir sürprizi de ben yaşadım. Imagine Cup Türkiye birincisi olan ve ülkemizi Polonya’ da düzenlenen finallerde başarılı bir şekilde temsil eden ekipten iki arkadaşımız da aramızdaydı.

IMG_3547

Imagine Cup Türkiye birincisi olan ekipten İbrahim Kıvanç(Imagine Cup 2010 Polonya Dünya Finalleri Ardından) ve  Yasemin Çelik, yarıştıkları BabyRC projesi hakkında kısaca bilgi verirken. (Ekibin bu akşamki eğitime katılamayan diğer üyeleri ise Burak Kanmaz ve Fatih Coşkun’ dur)

Eğitimimiz boyunca öncelikli olarak Service Oriented Architecture(SOA) kavramını kısaca tanımaya/anlamaya çalıştık. Sonrasında ise Microsoft’ un uzun süredir vizyonda olan SOA implemantasyonu WCF’ e(Windows Communication Foundation) giriş yaptık. WCF üzerinden uygulanabilen SOA desenelerini görüp, mimarisini ve çalışma zamanını kavradık. WCF’ in ABC’ sini de(AddressBindingContract) işin içerisine katmayı unutmadık elbette. Son olarak basit bir Hello World uygulaması geliştirip, WCF 4.0 ile birlikte gelen bazı yenilikleri(Discovery, Routing, Simplified Configurations) örnek demolar üzerinden anlamaya çalıştık.

Yaklaşık olarak 3 saatten fazla bir zamanımızı Microsoft İstanbul Ofisi Jupiter 1 salonunda geçirdik. Tabi akşam saati ve bir sonraki gününde mesai olması nedeniyle, özellikle uzakta oturan veya çok erken saatte işe giden arkadaşlarımızın bir kısmı mecburen erken çıkmak zorunda kaldılar. Ancak üzülmesinler nitekim bir şey kaçırmadılar. Tüm eğitimin video kaydını gerçekleştirdik. En kısa sürede render işlemini tamamlayıp Nedirtv?Com topluluğu üzerinden sizlerle paylaşıyor olacağım.

Bunlara ek olarak bir önceki eğitimimizde vaat ettiğimiz Pro .Net 4.0 Parallel Programming kitabını da, kazanan arkadaşımıza hediye ettik.

Bir sonraki eğitimimizin konusu WCF Eco System. 20 Ağustos 2010 Cuma günü yapılacak bu eğitimi kaçırmamanızı öneririm. Eğitimin duyurusu ve kayıt linki 15 Ağustos’ tan sonra duyuruluyor olacaktır.

Eğitimde Kullanılan Örnekler : TeknolojiGunleri_WCF.rar (304,80 kb)

Eğitime ait Powerpoint Sunumu : WCF 4.0 - Introduction - Microsoft.pptx (483,87 kb)

Microsoft Teknoloji Günleri Akşam Sınıfı – Gün 3 – WCF ile Servis Yaklaşımı

Çarşamba, 14 Temmuz 2010 14:12 by bsenyurt

BizSpark

 
 

GelisimAtolyesi

Tarih
20 Temmuz 2010 Salı

Saat
19.00 - 21.30

Yer
Microsoft İstanbul Ofisi

Eğitmen:
Burak Selim Şenyurt
Microsoft MVP

HemenKayit

 

Microsoft Teknoloji Günleri -
Akşam Sınıfı


Her ay düzenli olarak gerçekleştireceğimiz ve bir seri olarak birbirini takip edecek sınıf etkinliklerimizle 9 ay boyunca siz yazılım geliştiren ve tasarım yapan iş ortaklarımızla birlikte olacağız.

Aşağıda detaylarını paylaştığımız ve sizler için hayli faydalı olacağına inandığımız Microsoft Teknoloji Günleri Akşam Sınıfı Etkinliğimize kaydınızı hemen yaptırabilirsiniz.

Ders İçerikleri:

1. 25.Mayıs.2010/Salı: C# 4.0 ile Gelen Yenilikler : (2 Saat) Bu eğitimde C# programlama dilinin 4.0 versiyonu ile birlikte gelen yenilikleri tanıtmaya çalışılmakta ve özellikle, Dynamic diller ile Office API vb yapılar ile olan etkileşim üzerine örnekler geliştirilmektedir. Eğitimde temel olarak dynamic keyword, optional and named parameters, PIA, Co-Contra Variance Generics konularına değinilmektedir.

2. 22.Haziran.2010/Salı: .Net 4.0 ile Paralel Programlama : ( 2 Saat ) Uzun süredir ev bilgisayarlarımız dahil en az iki çekirdekli sistemler üzerinde çalışabiliyoruz. Son zamanlarda 8 çekirdeğe kadar çıkabilen yeni nesil işlemciler üzerinde paralel programlama yeteneklerini sonuna kadar kullanıp daha performanslı, hızlı, verimli ve ölçeklenebilir uygulamalar geliştirmeye ne dersiniz? İşte tam size göre bir eğitim. Bu eğitim ile .Net 4.0 kütüphanelerini kullanarak kolay bir şekilde nasıl paralel programlama yapabileceğinizi göreceksiniz.

3. 20.Temmuz.2010/Salı: WCF ile Servis Yaklaşımı : (2 Saat) .Net 3.0 ile birlikte duyurulan ve tek bir servis geliştirme metodolojisi sunarak daha önceki dağıtık mimari geliştirme tiplerini (Xml Web Services, .Net Remoting, MSMQ vb...) bir çatı altında birleştiren Windows Communication Foundation konulu eğitimdir. Eğitimde özellikle .Net 4.0 ile birlikte gelen yeniliklere de değinilmekte olup asıl amaç WCF ile uygulama geliştirme şekillerinden bir kaçını göstermek ve tanıtmaktır.

4. 20.Ağustos.2010/Cuma: WCF Eco System : (3 Saat ) WCF alt yapısı üzerine kurulu olan WCF Eco System içerisinde Data Services, Workflow Services, RIA Services, WebHttp Services ve Core Services tipleri yer almaktadır. Bu eğitimde Data Services, Workflow Services, RIA Services ve WebHttp Services konulu örnekler geliştirilmekte olup, söz konusu alt yapı ile değerlendirilebilecek hazır servis modelleri irdelenmektedir.

5. 20.Eylül.2010/Pazartesi: Windows Server AppFabric : (2 Saat) Bu eğitimde WCF ve Workflow servis örneklerinin izlenmesi, sorunların teşhis edilmesi, örneklerin yaşam döngülerinin takibi, konfigurasyon ayarlarının belirlenmesi ve pek çok yönetimsel konuda geliştiriciler ile IT yöneticilerinin daha kolay anlaşabilmelerini de sağlayan Dublin kod adlı Windows Server AppFabric ürün ailesi incelenmektedir. Özellikle IIS üzerine gelen eklentiler ile söz konusu yönetsel işlemlerin nasıl yapılabildiği derinlemesine incelenmektedir.

6. 20.Ekim.2010/Çarşamba: Worfklow Foundation 4.0 : (3 Saat) WF 4.0 beraberinde pek çok köklü yenilik ile gelmektedir. Geliştirilen Base Activity Library, paralel programlama desteği, veri akışı için gelen Argument, Variable gibi kavramlar ve daha pek çoğunun ele alındığı eğitimde basit örnekler ile WF modelin tanıtılmaya çalışılmaktadır.

7. 23.Kasım.2010/Salı: Asp.Net 4.0 : (3 Saat) Web Programlama’ nın .Net 4.0 ile birlikte gelen yeni yüzünü görmeye hazır mısınız? Pek çok yeni özellik ile birlikte gelen Asp.Net 4.0’ ın anlatıldığı bu eğitimde, temelden orta seviyeye kadar basit bir web uygulaması tasarlanmakta ve konunun daha iyi kavranabilmesi amaçlanmaktadır.

8. 20.Aralık.2010/Pazartesi: Visual Basic 2010 : ( 2 Saat) Bu eğitimde Visual Basic 2010 programlama dili ile birlikte gelen pek çok yeni özellik üzerinde durulmakta ve geliştirilen örnekler ile bu kavramlar pekiştirilmeye çalışılmaktadır. Bu noktada AutoImplemented Properties, Collection Initializers, Implicit Line Continuation, Mutlipe Lambda Expressions, Dynamic keyword, Type Equivalance Support gibi konular üzerinde durulmaktadır.

9. 20.Ocak.2011/Perşembe: WPF 4.0 ile Windows Programlama : (3 Saat) .Net 3.0 ile birlikte duyurulan Windows Presentation Foundation modeli ile zengin kullanıcı deneyimine sahip windows uygulamaları tasarlanabilmektedir. Özellikle Windows 7 üzerinde en iyi kullanıcı deneyimini sunan WPF 4.0 ile birlikte gelen yenilikleri öğrenmeye ne dersiniz?

Microsoft E-Bültenlerine Kayıt Olun | Kaydınızı Silin | Profilinizi Güncelleyin
© 2010 Microsoft Corporation
Kullanım Koşulları | Ticari Markalar | Gizlilik

Microsoft

 
Alt

Workflow Foundation Öğreniyorum - Ders 11 - WCF Servislerini Kullanmak

Salı, 13 Temmuz 2010 00:41 by bsenyurt

Merhaba Arkadaşlar,

NedirTv?com sponsorluğunda sürdürdüğümüz "Workflow Foundation 4.0 Öğreniyorum" serimizin on ikinci(11+1) dersi ile karşınızdayız. Servisler, yazılım geliştirme dünyasının olmazsa olmaz parçalarından birisidir. Özellikle son yıllarda servis geliştirme yaklaşımının parlayan yıldızı WCF Servisleri olarak düşünülebilir. Önceki dağıtık mimari geliştirme modellerini tek bir çatı altında birleştirmeyi başaran bu Microsoft yaklaşımı, Workflow Foundation ile de yakın ilişki içerisindedir. Bilindiği üzere servisleri kullanan istemciler çeşitli tipte olabilirler. Workflow örnekleri de bu anlamda birer istemci olarak görülebilirler. Bu durumda, bir Workflow örneği içerisinden WCF Servis Operasyonlarının çağırılması da söz konusudur. İşte bu görsel dersimizde söz konusu çağrı işlemlerini en basit haliyle ele almaya çalışıyoruz. Öyle ki; neredeyse Toolbox->Messaging sekmesinde yer alan ve servisler ile olan haberleşme işlemleri için kullanılan bileşenlerinden hiç birine dokunmadan. Nasıl mı? Haydi gelin öğrenelim.

Ders 11 - WCF Servislerini Kullanmak

Süre : 24:34

Dosya Boyutu : 34.7 Mb

Örnek : Lesson11.rar (110,13 kb)

Mp4 Formatında İndirmek İçin Tıklayın

Silverlight Tarafında HTTP Bazli Servisleri Kullanmak

Pazartesi, 12 Temmuz 2010 09:55 by bsenyurt

Merhaba Arkadaşlar,

Eğitmenlik yaptığım yıllarda Microsoft' un ders kitaplarında yer alan LAB çalışmalarını mümkün mertebe yapmaya ve yaptırmaya çalışırdım. Hatta çoğu zaman eğitimlere hazırlanırken sık sık bu lab çalışmalarını kendim yapar ve hatta ek ilaveler ile daha da eğlenceli hale getirmeye çalışırdım. Tabi bazen elimizde lab yapacağımız kitaplarımız olmazdı ki o ayrı bir hikaye. Lab çalışmaları öğrencinin adım adım yapması gerekenleri söylerek, konunun en yalın haliyle anlaşılmasını sağlamakta önemli rol oynamaktadır. Lab çalışmalarındakine benzer konu anlatımları benimde özümsediğim ve faydalı bulduğum öğrenme tekniklerinden birisidir. İşte bu yazımızda da bu kültüre uymaya çalışarak ilerlemeye çalışıyor olacağız. Hedefimiz Silverlight uygulamalarından, HTTP tabanlı taleplere göre operasyonel hizmetlerde bulunan servisleri nasıl kullanabileceğimizi, en yalın haliyle görmek. Haydi o zaman lab için gerekli materyalleri değerlendirerek yola koyulalım.

Adım 0 : Mevzumuz

Bilindiği üzere bazı servisler HTTP protokolü üzerinden GET, POST, PUT veya DELETE metod çağrıları ile kullanılabilmektedir. Bu anlamda WCF Eco System içerisinde yer alan WebHTTP servisleri, söz konusu tipteki hizmetleri sunmak üzere WCF alt yapısı üzerine oturmuş bir model sunmaktadır. Çok doğal olarak Silverlight tabanlı istemciler de bu servislerin tüketicileri olabilirler. Bu tip servislerin kullanıldığı senaryolarda istemci tarafında herhangibir Proxy tipi söz konusu olmadığı için, HTTP GET,POST,PUT veya DELETE metodlarının manuel olarak hazırlanması ve gönderilmesi gerekmektedir. Silverlight tarafında bu işlemler için WebClient veya HttpWebRequest tiplerinden yararlanılabilmektedir. Biz bu yazımızda WebClient tipinden yararlanarak, IIS(Internet Information Services) üzerinde konuşlandırılmış basit bir WebHttp Service örneğinin nasıl kullanılabileceğini incelemeye çalışıyor olacağız.

Adım 1 : WCF Rest Application Uygulaması ve Entity Data Model' in Oluşturulması

İşe ilk olarak WCF Rest Service Application şablonunda bir proje oluşturarak başlayabiliriz. Bildiğiniz üzere bu proje şablonu(Project Template) hali hazırda yüklü değilse Online Template' ler arasından install etmeniz gerekmektedir. Söz konusu örnekte Chinook veritabanında yer alan ve çok basit olarak ilerlemek istediğimizden sadece Album tablosunu içeren bir Entity Data Model kullanabiliriz. Aşağıdaki şekilde örneğimizde kullanmakta olduğumuz Entity Data Model yer almaktadır.

 

Adım 2 : WebHttp Service Örneğinin Geliştirilmesi

Entities isimli WCF WebHttp Service sınıfımızın içeriğini ise aşağıdaki gibi düzenlediğimizi düşünebiliriz.

using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace ChinookDataPortal
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class Entities
    {
        [WebGet(UriTemplate = "Albums/All")]
        public List<Album> GetAlbums()
        {
            List<Album> albums = null;

            ChinookEntities entities = new ChinookEntities();
            albums=(from albm in entities.Albums
                    orderby albm.Title
                    select albm).ToList();

            return albums;
        }

        [WebGet(UriTemplate="Albums/{firstLetter}")]
        public List<Album> GetAlbumsByFirstLetter(string firstLetter)
        {
            List<Album> albums = null;

            ChinookEntities entities = new ChinookEntities();
            albums = (from albm in entities.Albums
                      where albm.Title.ToLower().StartsWith(firstLetter.ToLower())
                      orderby albm.Title
                      select albm).ToList();

            return albums;
        }
    }
}

Servis tipimiz iki operasyon içermekte olup her ikiside HTTP Get çağrılarına cevap verecek şekilde düzenlenmişlerdir. GetAlbums metoduna yapılan çağrılarda servis URL adresine Albums/All takısı eklenmelidir. Diğer yandan ilk harflerine göre albümleri listeleyen GetAlbumsByFirstLetter metodu, URL adresine Albums/{firstLetter} bilgisinin eklenmesini beklemektedir. Her iki metod ChinookEntities tipini kullanmakta ve basit LINQ sorguları ile sonuç üretmektedir. Servisimizi bu şekilde geliştirdikten sonra IIS altına Publish ederek devam edebiliriz.

Adım 3 : IIS Publish

Publish işlemleri için aşağıdaki şekilde görülen Profile ayarlarını kullanabilirsiniz.

Bu ayarlara göre servisimizin IIS üzerinde yer alan Default Web Site isimli Application Pool altına dağıtılacağı belirtilmiş olunur.

Not: IIS üzerinden Convert To Application işlemini yapmanız gerekebilir.

Sonuç olarak IIS içerisinde aşağıdaki gibi servisin üretilmiş olması gerekmektedir. Bu arada örneği geliştirdiğimiz makinede Windows 7 Enterprise işletim sisteminin ve IIS 7.5.7600.16385 sürümünün olduğunu belirtelim.

Bu noktadan sonra Silverlight uygulamasının geliştirilmesi aşamına geçilecektir. Ancak öncelikle gerekli testleri yapılmasında yarar vardır.

ChinookDataPortal.rar (46,54 kb) [Örnek Visual Studio 2010 Ultimate RC ortamında geliştirilmiş ve test edilmiştir]

Adım 4 : WebHttp Service Test

Silverlight tarafındaki uygulamamızı geliştirmeden önce servisimizi IIS üzerinden test etmemizde ve çalıştığından emin olmamızda yarar olacağı kanısındayım. İlk olarak yardım sayfasına ulaşıp ulaşamadığımızı öğrenelim. Bilindiği üzere WebHttp Service örnekleri aksi belirtilmedikçe hazır bir yardım sayfası sunmaktadır. Bu amaçla tarayıcı uygulamadan http://localhost/ChinookDataPortal/Entities/help şeklinde bir talepte bulunduğumuzda, aşağıdaki ekran çıktısı ile karşılaşmış olmalıyız.

Yardım sayfasının çalışıyor olması dışında servis tarafında yer alan operasyonel metodların da test edilmesinde yarar vardır. Örneğin tüm albümleri elde etmek için http://localhost/ChinookDataPortal/Entities/Albums/All şeklinde talepte bulunduğumuzda, aşağıdaki ekran görüntüsünde yer alan sonuçları elde etmiş olmamız gerekmektedir. Tabi veri içeriklerinde değişiklikler söz konusu olabilir. Ancak XML çıktısının şematik yapısının benzer olması gerekmektedir.

Son olarak örneğin Cake adı ile başlayan albümleri çekmek istediğimizi ve bu amaçla URL satırından http://localhost/ChinookDataPortal/Entities/Albums/Cake şeklinde bir talep gönderdiğimizi düşünelim. Bu durumda ekran çıktısının aşağıdakine benzer olması gerekmektedir.

Eğer bu sonuçları elde edebiliyorsak servisimizin çalıştığını ve Sliverlight tarafı için kullanılabilir olduğunu söyleyebiliriz. Lakin dikkat etmemiz gereken bir nokta daha vardır.

Adım 5 : Client Access Policy Ayarları

Silverlight uygulamamızın farklı bir Domain içerisinde host edilmesine karşılık, IIS üzerinde gerekli Client Access Policy ayarlarının bulunması gerekmektedir. Bu nedenle IIS root klasörü altında yer alması gereken ClientAccessPolicy.xml dosyasının içeriğini aşağıdaki gibi düzenleyebiliriz.

<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from>
        <domain uri="*" />
      </allow-from>
      <grant-to>
        <resource path="/WorldWeatherService" include-subpaths="true"/>
        <resource path="/ChinookDataPortal" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Burada görüleceği üzere ChinookDataPortal ve alt yollarına erişim izni verilmiştir. Artık Silverlight tarafını geliştirmeye başlayabiliriz.

Adım 6: Silverlight Application Projesinin Oluşturulması

Bu amaçla Visual Studio 2010 ortamında ConsumingHTTPBasedServices isimi ve Silverlight 4.0 tabanlı bir Application oluşturduğumuzu düşünelim. Söz konusu uygulamada RIA Service kullanılmayacağı için bu seçeneği pasif olarak bırakabiliriz. Bu işlem sonucu oluşturulan MainPage sayfasına ait XAML içeriğini ise aşağıdaki gibi geliştirebiliriz.

Adım 7 : MainPage.Xaml içeriği ve Kodun Yazılması

<UserControl x:Class="ConsumingHTTPBasedServices.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="517">

    <Grid x:Name="LayoutRoot" Background="White">
        <ListBox Height="203" HorizontalAlignment="Left" Margin="8,70,0,0" Name="AlbumListBox" VerticalAlignment="Top" Width="497" />
        <StackPanel Height="54" HorizontalAlignment="Left" Margin="9,10,0,0" Name="ButtonsStackPanel" VerticalAlignment="Top" Width="496" Orientation="Horizontal" />
    </Grid>
</UserControl>

MainPage içerisinde yer alan ListBox kontrolü içeriği A' dan Z' ye harfler ile doldurulacaktır. Herhangibir harfe basıldığında, WebHttp Service' imiz için bir HTTP Get talebi oluşturulacak ve sonuçların ListBox içerisinde gösterilmesi sağlanacaktır. Bu amaçla kod içeriğini aşağıdaki gibi geliştirmemiz yeterlidir.

using System;
using System.Linq;
using System.Net;
using System.Windows.Controls;
using System.Xml;
using System.Xml.Linq;

namespace ConsumingHTTPBasedServices
{
    public partial class MainPage
        : UserControl
    {
        // WebHttp Servisine basit HTTP metodları ile talepte bulunabilmemizi sağlayan WebClient nesnesi tanımlanır
        WebClient client;

        public MainPage()
        {
            InitializeComponent();

            // WebClient nesnesi örneklenir
            client=new WebClient();
            // Belirtilen URL adresine yapılan talep sonucu gerçekleşecek okuma işlemi tamamlandığında(bir başka deyişle veri istemci tarafında indirildiğinde) devreye girecek olan olay metodu tanımlanır.
            client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted);

            // A...Z Button üretimleri gerçekleştirilir
            for (int i = 65; i < 91; i++)
            {
                Button btn = new Button();
                btn.Width = 18;
                btn.Height = 18;
                btn.FontSize = 10;
                btn.Content = ((char)i).ToString();
                ButtonsStackPanel.Children.Add(btn);
                // Herhangibir Button tıklandığında
                btn.Click += (o, e) =>
                {                  
                    // Önce WebHttp Service' ne doğur yapılacak HTTP Get talebi için gerekli URI oluşturulur
                    Uri address = new Uri(String.Format("http://localhost/ChinookDataPortal/Entities/Albums/{0}", ((Button)o).Content));
                    // Belirtilen URI talebi asenkron olarak çalışan OpenReadAsycn metodu ile gönderilir
                    client.OpenReadAsync(address);                   
                };
            }
        }

        // URI ile belirtilen adres talebi gerçekleştirilip ilgili veri içeriği istemci tarafına indirildikten sonra devreye giren olay metodudur
        void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
        {
            // İçerik bir Stream olarak gelmektedir ve tasarlanan ChinookDataPortal WebHttp Servisi varsayılan olarak XML içerik göndermektedir.
            // Bu sebepten Stream XmlReader ile okunur
            XmlReader xReader = XmlReader.Create(e.Result);
            // XLINQ sorgusunun yapılabilmesi için XElement.Load metodu parametre olarak Stream' i kullanan XmlReader nesne örneğini alır
            XElement xElement = XElement.Load(xReader);
            // XLINQ sorgusu ile Title elementleri çekilir. XName.Get metodunun ikinci parametre XML Namespace' inin adıdır.
            var titles = from x in xElement.Elements().Elements(XName.Get("Title", "http://schemas.datacontract.org/2004/07/ChinookDataPortal"))
                         select x.Value;
            // Çekilen veri içeriği ListBox kontrolünün ItemsSource özelliğine bağlanır
            AlbumListBox.ItemsSource = titles;
        }
    }
}

Not: XElement tiplerini kullanabilmek ve XLINQ sorgularını yazabilmek için, Silverlight uygulamasına(ConsumingHTTPBasedServices.Web uygulamasına değil) System.Xml.Linq.dll Assembly' ının referans edilmesi gerekmektedir.

Adım 8 : Silverlight Uygulamasının Test Edilmesi

Dilerseniz uygulamanın çalışma zamanı sonuçlarına hemen bakalım. Böylece çalışma zamanı testlerini yapmış oluruz. Örneğin A başlıklı Button kontrolüne bastığımızda, aşağıdaki ekran görüntüsündekine benzer sonuçları almış olmalıyız. Yani Title alanındakilerden A harfi ile başlayanların listesinin elde edilebiliyor olması gerekmektedir.

Görüldüğü üzere ListBox içeriği baş harfi A olan albüm adları ile doldurulmuştur. Hemen bu işlemin arkasından örneğin C başlıklı Button kontrolüne basarsak aşağıdaki sonuçlar ile karşılaştığımız görürüz.

Süper değil mi? Wink

Özet

Tabi bu örnekte dikkat edilmesi gereken noktalardan birisi de, istemci tarafında herhangibir Proxy tipinin olmayışıdır. Bunun yerine HTTP Get metodu ile talepte bulunulmuş ve elde edilen Stream üzerindeki XML içeriği değerlendirilmiştir. Diğer yandan çok doğal olarak Servis tarafında kullanılan Entity Data Model içerisindeki tiplerin istemci tarafındaki karşılıkları bulunmamaktadır. Eğer bu tiplerin istemci tarafında ele alınması arzu edilirse açık bir şekilde oluşturulmaları gerekecektir. Tabi böyle bir senaryoda gelen XML veya JSON tipindeki içeriğinde ilgili tiplere dönüştürülmesi gibi bir işlem söz konusu olacaktır.

Ödev Smile

  1. Servisin XML yerine JSON(JavaScript Object Notation) formatında bir çıktı vermesi halinde, Silverlight tarafında gerekli olan kod düzenlemelerini yapınız.
  2. Servis üzerinden HTTP Put metod ile güncelleme işlemi yapabilmenizi sağlayacak bir geliştirmeyi aynı örnek üzerinden yapmaya çalışınız.

Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

ConsumingHTTPBasedServices_RTM.rar (273,75 kb)[Örnek Visual Studio 2010 Ultimate RC Sürümü üzerinde geliştirişmiş ve RTM sürümü üzerinde test edilmiştir]

Duplex Service için Silverlight İstemcisi Geliştirmek

Pazartesi, 5 Temmuz 2010 10:00 by bsenyurt

Merhaba Arkadaşlar,

Hatırlayacağınız üzere bir önceki yazımızda Silverlight istemcilerinin kullanabileceği Duplex WCF Service uygulamalarının nasıl yazılabileceğini incelemeye çalışmıştık. Çok doğal olarak bu işin bir de istemci tarafı bulunmaktadır. İşte bu yazımızda söz konusu istemciyi geliştirmeye çalışacak ve bir önceki yazının yorgunluğunu üzerimizden atarcasına, basit bir şekilde ilerliyor olacağız. İlk olarak Visual Studio 2010 Ultimate RC ortamında Silverlight 4.0 tabanlı bir uygulama oluşturarak işe başlayabiliriz. Bu işlemin ardından Proxy tabanlı bir WCF servis kullanımı için Add Service Reference seçeneğine başvurmamız gerekecektir. Yine hatırlayacağınız üzere geliştirdiğimiz WorldWeatherService isimli servisi IIS üzerine Publish etmiştik. Bu sebepten ilgili servis referansına aşağıdaki şekilden de görüldüğü üzere http://localhost/WorldWeatherService/WeatherDuplexService.svc adresinden erişebiliriz.

İstemci tarafında çok basit olarak aşağıdaki XAML içeriğine sahip bir kontrol kullanıyor olacağız. Buna göre istemciler bir şehir adı girerek sunucudan anlık hava durumu bilgilerini alabilecekleri bir arayüze sahip olacaklar. Aslında alacaklar demek çok doğru bir tabir değil. Nitekim servisin kendisi, bağlı olan istemci üzerinde tetiklediği bir operasyona bu bilgileri parametre şeklinde gönderiyor olacak.

<UserControl x:Class="WeatherClientApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="230" d:DesignWidth="479">

    <Grid x:Name="LayoutRoot" Background="White">
        <Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="207,27,0,0" Name="StartButton" VerticalAlignment="Top" Width="75" Click="StartButton_Click" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="25,27,0,0" Name="CityTextBox" VerticalAlignment="Top" Width="165" />
        <ListBox Height="142" HorizontalAlignment="Left" Margin="24,64,0,0" Name="WeatherStatusListBox" VerticalAlignment="Top" Width="434" />
    </Grid>
</UserControl>

İstemci tarafı kodlarına gelince;

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Windows;
using System.Windows.Controls;
using WeatherClientApp.WeatherServiceReference;

namespace WeatherClientApp
{
    public partial class MainPage : UserControl
    {
        WeatherDuplexServiceClient proxy = null;

        public MainPage()
        {
            InitializeComponent();

            EndpointAddress address = new EndpointAddress("http://localhost/WorldWeatherService/WeatherDuplexService.svc");
            PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding(PollingDuplexMode.MultipleMessagesPerPoll);
            proxy = new WeatherDuplexServiceClient(binding, address);

            proxy.SetCityCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(proxy_SetCityCompleted);
            proxy.NoticeReceived += new EventHandler<NoticeReceivedEventArgs>(proxy_NoticeReceived);
        }

        void proxy_NoticeReceived(object sender, NoticeReceivedEventArgs e)
        {
            WeatherStatus wStatus = e.weather;
            WeatherStatusListBox.Items.Add(String.Format("{0}({1} C){2}", wStatus.City, wStatus.Heat, wStatus.Summary));
        }

        void proxy_SetCityCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            WeatherStatusListBox.Items.Add("SetCity çağrısı tamamlandı");
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            WeatherStatusListBox.Items.Clear();
            proxy.SetCityAsync(CityTextBox.Text);
        }
    }

}

Dikkat edileceği üzere WeatherDuplexServiceClient tipinden olan proxy nesnesi örneklenirken iki önemli parametre bilgisi geçilmektedir. Bunlardan ilki PollingDuplexHttpBinding tipinden olan bağlayıcı tiptir(Binding Type). Diğeri ise servise erişilecek olan Endpoint adresidir. İstemci tarafı asenkron olarak SetCity metoduna erişebilir. Bu nedenle SetCityCompleted olay metodu yüklenmiştir. Dikkat çekici noktalardan birisi de NoticeReceived isimli bir olayın söz konusu olmasıdır. Bilinen Completed son eki yerine Received son ekinin gelmesinin de bir anlamı vardır elbette. Wink Bu, istemcinin servisten gelen Notice çağrısını takiben devreye girecek operasyon ile alakalıdır. Bir başka deyişle servis tarafı Notice metodunu çağırdıktan ve bu operasyon işleyişini tamamladıktan sonra istemci tarafında proxy_NoticeReceived olay metodu devreye girecektir. Ayrıca, bu olay metodunun NoticeReceivedEventArgs tipinden olan parametresi üzerinden yakalanan weather özelliği yardımıyla, servisin gönderdiği WeatherStatus nesnesine ulaşılabilir. Sonuç olarak uygulamayı test ettiğimizde örnek olarak aşağıdakine benzer bir sonuç elde ettiğimizi görebiliriz.

Üç sonuç gelmesi tamamen servis tarafındaki zamanlama ayarları ile alakalı bir durumdur. Bu sürelerde oynayarak servisin istemci tarafına kaç kere bildirimde bulunacağını da ayarlayabilirsiniz. Önemli olan nokta servisin istemci üzerinde bir operasyon tetiklemesidir. Bunu yazdığımız istemci ile test etmiş olduk.

Tüm bu çalışma sırasında dikkat edilmesi gereken bir husus da, önceki yazımızda da değinmiş olduğumuz Client Access Policy kullanımıdır. Eğer IIS root klasörü altında ClientAccessPolicy.xml dosyası ve gerekli içeriği olmassa çalışma zamanında aşağıdaki hata mesajı ile karşılaşılacaktır.

Oysaki geliştirdiğimiz örnek Asp.Net Development Server üzerinden yayınlanmaktadır(http://localhost:22334/WeatherClientAppTestPage.aspx) ve sorunsuz bir şekilde IIS üzerindeki WorldWeatherService uygulamasına erişebilmektedir. Dolayısıyla Silverlight uygulamalarında sıkça rastladığımız Cross Domain sorunu yaşanmamaktadır. Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

WeatherClientApp.rar (540,12 kb) [Örnek Visual Studio 2010 RC sürümü üzerinde geliştirilmiş ve test edilmiştir]

Workflow Foundation Öğreniyorum - Ders 10 - InvokeMethod

Cuma, 2 Temmuz 2010 11:00 by bsenyurt

Merhaba Arkadaşlar,

NedirTv?com sponsorluğunda sürdürdüğümüz "Workflow Foundation 4.0 Öğreniyorum" serimizin onbirinci(10+1) dersi ile karşınızdayız. Bu dersimizde harici metodların, InvokeMethod Activity bileşeni yardımıyla nasıl çağırılabileceğini incelemeye çalışıyoruz. InvokeMethod bileşeni ile, static sınıflar içerisinde yer alan static metodların veya örneklenebilir sınıflar içerisinde yer alan metodların çağırılma şekillerini irdelediğimiz projemizde, yine Ado.Net Entity Framework tabanlı bir veri kaynağını kullanarak ilerliyoruz. E haydi o zaman. Keyifli seyirler dilerim.

Ders 10 - InvokeMethod

Süre : 12:48

Dosya Boyutu : 18.7 Mb

Örnek : Lesson10.rar (98,86 kb)

Mp4 Formatında İndirmek İçin Tıklayın