6 Kasım 2010

Windows Phone 7 de WCF Kullanmak


Bu yazımızda Wcf servislerinin Windows Phone 7 uygulaması içerisinden kullanımını bir örnek ile incelemeye çalışacağız. Öncelikle bir wcf servis hizmet sağlayıcısı hazırlayarak kodlarımızı yazmaya başlayacağız. Server tarafta bir servis hosting'imiz olacak. iis üzerinden değil de, bir windows uygulaması ile kodsal olarak servisimizi hazırlayalım.

Yapacağımız örnek için şöyle bir iş seneryosu belirleyebiliriz: server tarafta 'kod' ve 'adi' alanlarından oluşan Urun isimli sınıfımız ve Urun'e ait verilerin olduğunu varsayalım. Client windows phone 7 uygulamamız içinden bu ürünleri 'adi' alanının başlayan harflerine göre arama sonucunu bir listbox'da listeleyelim.

Server Tarafın Hazırlanması

VS 2010 / New Project /Windows Forms Application ile yeni bir forms projesi oluşturalım ve oluşturduğumuz projeye .Net Framework 4.0'a bağlı System.ServiceModel referansımızı eklememiz gerekiyor. References/Add Reference/ System.ServiceModel ayrıca aynı sekmeden Urun nesnemiz için kullanacağımız System.Runtime.Serialization referansını da kullanacağız.

Urun, UrunManager isimli arama işleminde kullanacağımız sınıflarımızı ve IUrunManager isimli interface'imiz aşağıdaki gibi olsun. UrunManager sınıfı içinde dummy veri olarak örnek bir kaç adet ürünlerimiz olsun.

C#

public class Urun {

[DataMember]

public string Kodu { get; set; }

[DataMember]

public string Adi { get; set; }

public Urun() {}

public Urun(string kodu,string adi) {

Kodu = kodu;

Adi = adi;

}

}


[ServiceContract]

public interface IUrunManager {

[OperationContract]

Urun[] UrunAra(string filtre);

}


public class UrunManager : IUrunManager {

static List<Urun> listOfUrun;

static UrunManager() {

listOfUrun = new List<Urun>();

listOfUrun.Add(new Urun("T1", "Tornavida"));

listOfUrun.Add(new Urun("V1", "Vida 1mm"));

listOfUrun.Add(new Urun("V2", "Vida 3mm"));

listOfUrun.Add(new Urun("TS1", "Testere - Ağaç"));

listOfUrun.Add(new Urun("TS2", "Testere - Metal"));

listOfUrun.Add(new Urun("I1", "İngiliz Anahtarı 14mm"));

listOfUrun.Add(new Urun("I2", "İngiliz Anahtarı 15mm"));

}

public Urun[] UrunAra(string filtre) {

return listOfUrun.FindAll(delegate(Urun u) { return u.Adi.StartsWith(filtre);

}).ToArray();

}



Formumuza ait kodlarıda aşağıdaki gibi hazırlayalım.

C#

public partial class Form1 : Form {

private ServiceHost _serviceHost;

public Form1() {

InitializeComponent();

}

private void btnStart_Click(object sender, EventArgs e) {

_serviceHost = new ServiceHost(typeof(UrunManager), new Uri("http://localhost:5000/UrunManager"));

ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

smb.HttpGetEnabled = true;

smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;

_serviceHost.Description.Behaviors.Add(smb);

_serviceHost.Open();

lblMsg.Text = "Wcf Service Started.";

}


private void btnStop_Click(object sender, EventArgs e) {

if (_serviceHost.State == CommunicationState.Opened) {

_serviceHost.Close();

lblMsg.Text = "Wcf Service Stoped.";

}

}

}


Formumuzu çalıştırıp 'Start Service' butonuna tıkladığımızda "Wcf Service Started" mesajı ile birlikte servisimizi açmış olacağız. Şimdide Windows Phone 7 uygulamamızı hazırlayalım.

Client Taraf

Öncelikle VS 2010 / File / New Project / Silverlight for Windows Phone sekmesinden yeni bir mobil proje ekleyelim. Açılan yeni projemizin MainPage.xaml (ana sayfayı kullanıyoruz) kodları ContentGrid içerisine aşağıdaki gibi xaml kodları ile Urun arama işlemini gerçekleştireceğimiz ekranımızı hazırlayalım.

XAML

<Grid x:Name="ContentGrid" Grid.Row="1">

<Grid>

<Grid.RowDefinitions>

<RowDefinition Height="70"/>

<RowDefinition Height="*"/>

Grid.RowDefinitions>

<StackPanel Grid.Row="0" Orientation="Horizontal">

<TextBox x:Name="txtSearch" Width="300"/>

<Button x:Name="btnSearch" Width="150" Content="Ara"/>

StackPanel>

<ListBox x:Name="lstBoxUrunler" Grid.Row="1" FontSize="24" Margin="15,3,3,3"/>

Grid>

Grid>


xaml da tanımladığımız nesnelerden sonra sıra listbox'ımızı dolduracak kodlara geldi. Öncelikle server tarafta hazırladığımız servis referansımızı windows phone projemize ekleyelim. Project / References / Add service referance / 'http://localhost:5000/UrunManager'


MainPage.cs içinde yer alan kodlarımızıda aşağıdaki gibi hazırladıktan sonra Phone 7 Emulator aracılığı ile uygulamamızı başlatabiliriz.

C#

using System.Windows;

using Microsoft.Phone.Controls;

using WinPhoneUrunAra.ServiceReference1;

using System.ServiceModel;


namespace WinPhoneUrunAra {

public partial class MainPage : PhoneApplicationPage {

private UrunManagerClient clientProxy;

// Constructor

public MainPage() {

InitializeComponent();

Loaded += MainPage_Loaded;

btnSearch.Click += btnSearch_Click;

}


private void MainPage_Loaded(object sender, RoutedEventArgs e) {

clientProxy = new UrunManagerClient(new System.ServiceModel.BasicHttpBinding(),

new EndpointAddress("http://localhost:5000/UrunManager"));


clientProxy.UrunAraCompleted += clientProxy_UrunAraCompleted;

}


private void btnSearch_Click(object sender, RoutedEventArgs e) {

clientProxy.UrunAraAsync(txtSearch.Text.Trim());

}


private void clientProxy_UrunAraCompleted(object sender, UrunAraCompletedEventArgs e) {

lstBoxUrunler.Items.Clear();

if (e.Error == null) {

for (int i = 0; i < e.Result.Count; i++) {

Urun urun = e.Result[i];

lstBoxUrunler.Items.Add(string.Concat(urun.Kodu, " - ", urun.Adi));

}

}

else {

MessageBox.Show(e.Error.Message);

}

}

}

}



Emulator başladıktan sonra uygulamamız hazır olacaktır. Ana sayfa üzerindeki arama textbox üzerine istediğimiz ürünün baş harflerini yazıp ara dememiz yeterli olacaktır. Silverlight üzerinde Wcf servisimiz asenkron çalıştığından dolayı form load event handler altında UrunAraComplated event'ımızı oluşturduktan sonra, 'Ara' butonu ile arama işlemini tetiklemiş olacağız.


Kolay gelsin.

Hiç yorum yok: