14

EKM

2010

Silverlight ile WebService kullanımı

Yazan: Barış Samancı
Kategoriler:ASP.net, Silverlight

Forumlarda gezinirken bazı kişilerin silverlight uygulamaları için webservis yazdıklarını, localde çalıştırdıklarını fakat sunucuya attıkları zaman çalıştıramadıklarını okudum. Bu yazımda bu sorunun üstesinden nasıl gelineceğini ve en basit haliyle silverligt uygulamaları için webservis yazıp nasıl kullanabileceğimizi göstereceğim.

Silverlight uygulamalarına istekte bulunulduğunda uygulama sunucudan istemcinin bilgisayarına indirilir ve istemcinin bilgisayarındaki sl runtime vasıtasıyla browser üzerinde çalışmaya başlar. Haliyle silverlight uygulamamız sunucudan habersiz olarak istemcinin bilgisayarında çalışır. Sunucudaki bir bilgiye erişmek istediğimizde veya sunucuya mesaj, veri göndermek istediğimizde webservislerini kullanırız. Örneğin sunucudaki veritabanını kullanmak istediğinizde veya benim gibi sıkça sunucudaki dosya ve dizinleri dinamik olarak almak istediğinizde webservislerini kullanabilirsiniz.Bu yazımda benim sıklıkla fotoğraf galerisi, mp3 player tarzı uygulamalarımda kullandığım bir yöntemi göstereceğim.

Bu yazıda webservislerinin ne olduğunu anlatmayacağım. Merak edenler favori arama motorunu kullanabilirler.

Silverlight uygulamalarının istemcinin bilgisayarına inip çalıştığını söyledik. Haliyle sunucudaki dosyalara erişmek istediğinizde Directory sınıfından metodlar çalışmayacaktır. Çünkü uygulama istemcinin bilgisayarında çalışmaktadır. Bu yazıda sunucudaki bir dizin altındaki resim formatındaki dosyaları silverlight ile dinamik olarak nasıl elde edebileceğinizi göstereceğim. Bu yolla istediğiniz bir dizin altındaki fotoğrafların tam adresini öğrenip istemcinin bilgisayarına download edebilir, fotoğraf galerisi tarzı bir uygulama yapabilirsiniz. Ayrıca sunucudaki dizinlere ftp veya http üzerinden yüklediğiniz yeni resimler için herhangi bir değişiklik yapmanıza gerek kalmaz. Dinamik olarak yeni eklenen resimlerinde adreslerini alabilirsiniz.

Şimdi yeni bir silverlight uygulaması açalım ve aşağıdaki şekildeki gibi uygulamamızı yayınlamak için asp.net web sitesi istediğimizi belirtelim.

new silverlight application

Şimdi uygulamamıza bir adet buton ve sunucudaki resim dosyalarının isimlerini göstermek için bir adet listbox ekleyelim. Örnek olarak MainPage.xaml altına aşağıdaki kodları girebilirsiniz.

xaml

Arayüzde bir adet buton ve altında bir listbox oluştuğunu göreceksiniz. Uygulama arayüzümüz aşağıdaki şekildeki gibi olacaktır.

silverlight application

Şimdi projemize yeni bir webservis ekleyip kodlarımızı yazalım. Önce silverlight uygulamamızı barındırdığımız demo asp.net sitesine bir webservis ekleyelim. Aşağıdaki şekildeki gibi asp.net uygulamasına sağ tıklayıp add new item seçeneği ile webservisimizi ekleyebiliriz.

add new webservice

Webservisimizin asp.net sitesi altına eklendiğini göreceksiniz. webservisim.asmx.cs dosyasında webservisin kodlarını görebilirsiniz. Varsayılan olarak [WebMethod] niteliği ile işaretlenmiş bir helloworld metodu bulacaksınız. Burdaki [WebMethod] niteliği yazdığımız metodların uzak web istemcileri tarafından çağrılabilmesini sağlar.

Şimdi kendi metodumuzu yazalım. Ben geriye string türünden liste dönen ve string olarak parametre alan bir metod yazdım. Parametresine elde etmek istediğimiz dosyaların uzantısını yazıyoruz. Örneğin jpg dosyaları için "*.jpg", mp3 dosyaları için "*.mp3" yada tüm dosyalar için "*.*" yazabilirsiniz. Metod sunucu dizinindeki dosyalar üzerinde işlem yapmaktadır. Server.MapPath("") ile sunucu anadizinine ulaşılır. Metodu kendinize göre modifiye edip istediğiniz dizinide parametre olarak geçebilirsiniz. Şimdi webservisim.asmx.cs dosyasına aşağıdaki gibi kodumuzu ekleyelim. Ben sadece dosya isimlerini almak istediğim için Path.GetFileName metodunu kullandım. Tüm yolu istiyorsanız liste.dosyalar.ToList( )  kullanabilirsiniz.

public class webservisim : System.Web.Services.WebService
    {

        [WebMethod]
        public List<string> DosyalariGetir(string pattern)
        {
            List<string> liste = new List<string>();

            string[] dosyalar = Directory.GetFiles(
                Server.MapPath("") ,
                pattern,
                SearchOption.TopDirectoryOnly);

            foreach (var item in dosyalar)
            {
                liste.Add(Path.GetFileName(item));
            }
            
            return liste;
        }
    }

Şimdi projeyi build edelim ardından webservisimizi silverlight uygulamasına ekleyelim. Bunun için solution explorer da silverlight uygulamanıza sağ tıklayın ve aşağıdaki şekildeki gibi Add Service Referance' a tıklayın. Aşağıdaki gibi açılan pencereden Discover butonuna tıkladığınızda yazdığımız webservisini otomatik olarak bulacaktır. 

add service Reference

add service reference
 

Bu aşamadan sonra web servisimizin referansı silverligt uygulamamıza eklenmiş olacaktır. Solution Explorerda aşağıdaki şekildeki gibi gözükür.

Solution Explorer

Bu aşamadan sonra silverlight tarafındaki kodumuzu yazmaya başlayabiliriz. Arayüze bir buton eklemiştik ve ismi "btn" idi. MainPage constructor'ında bu buton tıklandığında çalışacak bir metod yazalım ve butonun click event'ına bağlayalım. Webservisleri asenkron olarak çalışmaktadır. Webservisinden istekte bulunuruz ve cevap döndüğünde completed event'ına bağladığımız metod çalışır. Aşağıdaki kodda anlattıklarımı bulabilirsiniz. Butona tıklantığında butonun btn_Click metodu çalışmakta ve bu metod altında ws.DosyalariGetirAsync("*.jpg"); satırı çalışmaktadır. Bu satır ile webservisimizdeki belirttiğimiz dizindeki jpg uzantılı dosyaları istiyoruz.Cevap geldiğinde ise ws_DosyalariGetirCompleted metodu tetikleniyor. Bu metodun ikinci parametresi olan e nesnesindeki Error property'si null ise cevap hatasız bir şekilde gelmiş demektir. Gelen cevap string türünden liste olacağından e.Result.Count propertysi ile kaç adet resim bulunduğunu öğreniyoruz ve bilgileri e.Result[i] şeklinde okuyup listboxa atıyoruz.

public partial class MainPage : UserControl
    {
        ServiceReference1.webservisimSoapClient ws = new ServiceReference1.webservisimSoapClient();
        public MainPage()
        {
            InitializeComponent();
            btn.Click += new RoutedEventHandler(btn_Click);
            ws.DosyalariGetirCompleted += new EventHandler<ServiceReference1.DosyalariGetirCompletedEventArgs>(ws_DosyalariGetirCompleted);
        }

        void ws_DosyalariGetirCompleted(object sender, ServiceReference1.DosyalariGetirCompletedEventArgs e)
        {
            if (e.Error == null)
            {                
                for (int i = 0; i < e.Result.Count; i++)
                {
                    lstbx.Items.Add(e.Result[i]);
                }
            }

        }

        void btn_Click(object sender, RoutedEventArgs e)
        {
            ws.DosyalariGetirAsync("*.jpg");
        }

    }

Şimdi uygulama dizinindeki dosyalara bir göz atalım ve uygulamamızı çalıştırıp butona tıklayalım.

 directory
silverlight application with webservice

Görüldüğü gibi uygulama sadece sunucunun anadizinindeki .jpg uzantıya sahip resim dosyalarını aldı.

Şimdi gelelim yazının başında belittiğim, webservislerini sunucuya attıkları zaman çalıştıramayan arkadaşların sorununa. Görüldüğü gibi webservisimiz localde çalışmaktadır. Çünkü webservice'in adresi yukarıdaki şekillerdende görüleceği üzere "http://localhost:53792/webservisim.asmx"şeklindedir. Silverlight uygulamasını sunucuya atarken buradaki localhost:53792 adresini webservisinizin sitenizdeki yerini gösterecek şekilde düzenlemelisiniz. Bunu şu şekilde yapabilirsiniz. silverlight uygulamaları uzantısı .xap şeklinde oluşturulmaktadır fakat aslında bu dosyalar zip dosyalarıdır. Silverlight uygulamanızın .xap uzantısını .zip ile değiştirin ve içindekileri çıkartın. ServiceReferences.Client.Config dosyasını metin editörü ile açtığınızda webservisinizin referansının localinizi gösterdiğini görürsünüz. Bunu webservisinizin sitenizdeki adresi ile değiştirip tekrar zip dosyası halinde değiştirmeniz gerekmektedir. Tabi uzantısınıda .xap yapıyoruz gene. Aşağıdaki şekilde anlattıklarımı gözükmekte ve bu yazı burda bitmektedir. İyi çalışmalar.

silverlight application with webservice

Uygulama dosyalarını SLWebServiceKullanimi.zip ( 5.78Mb ) linkinden indirebilirsiniz.

Yorumlar
16 Kas 2011 Çarşamba, 10:12 tarihinde yazmış.

çok teşekkür ederim. faydalı oldu.

Adınız *:
e-Mail Adresiniz *:  ??
Web Siteniz:
Yorumunuz *:
Kalan karakter sayısı: 500
 
 

Tasarım ve Programlama Barış SAMANCI
Her hakkı saklıdır.
barissamanci.net  ©  2010-2024