25 Aralık 2010 Cumartesi

.Net Teknolojisinde PageMethod Kavrami

Daha onceden konustugumuz gibi, bazi durumlarda sitemizde tum sayfanin post edilmesindense, sadece belli bolumlerinin post edilmesini isteriz. Peki ne gibi fayda saglar bu durum? Basit bir senaryo uzerinden anlatmak gerekirsek;

Bir uyelik formunda, sehirleri bir dropdownlistten alalim. Dropdownlist'in enable postback ozelligini acik birakirsak, her sehri sectigimizde sayfa post edilir. Ama bizim isteğimiz sadece o dropdownlist'in post edilmesi, tüm sayfanın degil. Zaten tum sayfa post edilse, life cycle sürecine tekrar başlayacağından, textbox'lar, butonlar, vs... tüm kontroller yeniden yükleneceginden, o ana kadar girmis oldugumuz tum kayitlar silinecekti. Hoop en bastan doldurmaya basla tekrar, isin yoksa. Tum bunlarin otesinde, tum sayfanin post edilmesine ne gerek var. Biz sadece sehirler kismini degistiriyoruz, neden bize tekrar tum sayfanin bilgileri geliyor. Gereksiz yere bilgiler yukleniyor ve dolayisiyla sayfa acilimi biraz daha gecikiyor.

İste bu veri fazlaligindan, gecikmeden, post edildikten sonra verilerin kaybolma durumundan kurtulmak icin yapmamiz gereken, update panel'in icine dropdownlist'i ekleyip, triggers property'sinden hangi control icin bu islemi yapacagimizi (bu ornek icin dropdownlist) hangi eventinde(selectedindexchanged) sadece bu kontrolun postback edilecegini belirtiriz. Bunu yaptigimiz zaman goruruz ki, sayfanin yuklenmesi daha hizli olacak, progress bar yuklenmeyecek, daha buyuk veriler icin yuklenme sirasinda asenkron uygulamaya(yukleme sirasinda degisiklik yapilabilinecek sayfada) izin verilecek. Ayrica tum sayfa yuklenmeyeceginden, 500 byte'lik yuklenme yaklasik 150lere vs. dusecek (sayfadaki kontrollere gore degisebilir.) Viewstate icerisinde bazi bilgilerin geldigini gorecegiz.

Bu senaryodan bile daha iyi bir ozelligimiz var bizim. Neden her defasinda viewstate doluyor. 193 byte yerine, bize sadece dropdownlist icerisindeki bilgi gelsin. DDL icerisinde 10 secildiyse, sadece 10 gelsin. Yani bize sadece data gelsin.

Sadece data gelmesini istememiz, bize web servisleri hatirlatiyor. Orada, web methodlarimiz, baska server uzerindeyken, baska makinenin serverindan biz methodlari cagirirken, burada kendi makinemizde WebMethod yazip onu cagiracagiz. Cagirma isini de, UpdatePanel'de ScriptManager kendi basina yazarken, biz burada ekstra bilgi gelmemesi icin biz yazacagiz.

Tum bu bilgiler cercevesinde, simdi kisa bir ornek ile pekistirelim. Once kendi web methodumuzu yazalim, ardindan sayfanin source kisminda, iki javascript fonksiyonu yazalim. Birincisi, bizim yazdigimiz webmethodu cagirsin; ikincisi de, yazdigimiz webmethoddan geriye donen degeri label'a yazsin.

[WebMethod]

public static string GetStokMiktari(string urunKod)

{

return urunKod;

}

Yazdigimiz bu webmethod'u okumak icin su js fonksiyonunu yazariz.

function CallGetStokMiktari() {

var ctrl = document.getElementById('TextBox1');

PageMethods.GetStokMiktari(ctrl.value,CallBackGetStokMiktari);

}

GetStokMiktari methodumuz, ilk parametre olarak TextBox'in degerini alirken (html tabanli programlamada textbox'in text'inden soz edemeyiz,textbox'in value'si olur. Aslinda textbox'da input type="button" 'a donusur.)

Simdi de TextBox'dan okudugumuz degeri, Label'a yazan JavaScript fonksiyonunu yazalim;


function CallBackGetStokMiktari(result) {

var ctrl = document.getElementById('Label1');

ctrl.innerText = result;

}

TextBox'dan okunan verinin Label'a aktarilmasi icin bir button koyalim, buttona tiklaninca label'in ici dolsun. Yapmamiz gereken sadece, buttonun onclickine yazdigimiz js fonk'unun adini vermek olacak.

input id="Button2" type="button" value="button" onclick="CallGetStokMiktari()" />


Kodumuzu derlediğimiz zaman, calismadigini gorecegiz. Bunun nedeni, ScriptManager arka planda bazi ozel js fonksiyonlarini yazmamasi. Bunun nedeni, bizim WebMethod yazdigimizi bilmemesi. Eski senaryoda biz UpdatePanel surukleyerek ona belirtmis oluyorduk, fakat simdi sadece kodlarla kendimiz yazdigimizdan, ozellikle ScriptManager'e soylememiz gerekir bizim WebMethod yazdigimizi.ScriptManager'imize su kodu eklersek sorun kalmayacaktir.

asp:ScriptManager EnablePageMethods="true" ID="ScriptManager1" runat="server">

asp:ScriptManager>

Yazdığımız js fonksiyonları ile birlikte, bize sadece textbox,a girilen değer gelecektir. Ne sayfa post edilecektir, ne de viewstate içerisinde updatepanel vs... gibi kontrollerin kodları gelecektir. Böylece sayfa açılımı ve performans son derece artacaktır. UpdatePanel kullanarak 600-700 mblık veri yükleme işlemi, şimdi sadece 10-15 mb civarında olacaktır.Gördüğünüz gibi bazı durumlarda sadece UpdatePanel kullanmak da performansı artırmıyor. Tabiki tüm sayfanın post edilmesine nazaran bir artıştan söz edebiliriz ama bize gerekli olan sadece TextBox'ın Text'i veya DropDownList'in SelectedItem'ı olacağından, tekrar viewstate'i şişirmeye veya tüm sayfanın bilgilerini tekrar sayfaya yüklemeye gerek kalmayacaktır.

Burada, kendi yazdigimiz bir webmethod uzerinden eristik. Disardan alinan hazir webservis methodlarini kullanarak da bu islemi yapabiliriz. Degisen hicbir sey olmayacak. Sadece WebServis makalemde belirttigim gibi WSDL tanitilacak. Yine webmethodun geri donus degerine gore iki js fonksiyonu yazilir. Tek onemli nokta, bizim disardan aldigimiz webmethodun, js ile kullanilabilmeye elverisli olmalidir...

0 yorum: