Makale Özeti

Bu makalede, ASP.NET 2.0 AJAX eklentili sayfalarda, kullanıcı taraflı JavaScript kullanarak; sunucu taraflı Web servislerini yeni gelen inanılmaz yararlı özellikleri kullanarak çağırabilmeyi göreceğiz.

Makale

AJAX Eklentileri İle Kullanıcı Taraflı Web Servisi Çağırma I

En başından beri, ASP.NET temelde sunucu taraflı bir teknolojiydi. ASP.NET in kullanıcı taraflı JavaScript üretebildiği belirli yerler vardı. Örneğin, doğrulama kontrolleri, son gelen Web Part mimarisi gibi. Yazılım geliştiriciler olarak da, bir sonraki POST isteğine kadar, kullanıcı ne yapar ne eder hiç ilgilenmezdik. Yazılım geliştiriciler, kullanıcı taraflı Java-Script kullanarak daha fazla interaktif sayfalar yapma gereksinimi duydular ve DHTML bu işi biraz da ASP.NET 2.0 daki callback özelliği ile kendi kendine yapmaya çalıştı. Bu da geçen sene içinde tamamı ile değişti.

Eylül 2005’ deki Microsoft Professional Developer's Conference’ ında, Microsoft, ASP.NET için yeni bir eklenti ortaya çıkardı ve kod ismine “Atlas” dedi. Atlas tümü ile kullanıcı taraflı JavaScript, DHTML ve XMLHttpRequest nesnesi üzerine yoğunlaşmıştı. Hedef ise, yazılım geliştiricilere daha fazla AJAX destekli web uygulamaları yapabilmelerine olanak sağlamaktı. Bu framework, kullanıcı taraflı veri bindirmelerden DHTML animasyonlara kadar birçok özellik ve UpdatePanel kullanarak karmaşık kullanıcı POST back leri gibi davranışlar ile; Microsoft tarafından resmi olarak AJAX kütüphanesi ve ASP.NET 2.0 AJAX Extensions (eklentileri) diye telafuz edilmeye başladı. Gelen bu birçok özellğin altında yatan asıl şey ise, kullanıcı taraflı JavaScript çağrıları ile etkileşebilen ve parse etmesi oldukça kolay bir form ile sunucudan asenkronize olarak veri getirebilme yeteniği idi. İşte bu makalemizin konusuda; ASP.NET 2.0 AJAX eklentili sayfalarda, kullanıcı taraflı JavaScript kullanarak; sunucu taraflı Web servislerini bu yeni ve inanılmaz yararlı özellikleri kullanarak çağırabilmeyi görmek.

AJAX ile Web Servislerini Çağırma

Eğer herhangi bir şekilde daha önceden ister wsel.exe aracıyla proxy yaratarak ya da Visual Studio nun “Add Web Reference” özelliğini kullanarak; Microsoft .NET Framework içinde bir Web servisi yarattıysanız, Web servislerini çağırabilmek için .NET tipleriyle çalışmaya alışıksınızdır. Aslında .NET proxy üzerinden Web servis çağırmak aynı başka bir sınıftan methot çağırmaya benzer. Proxy sadece gönderdiğiniz parametrelere göre XML hazırlama işi ile ilgilenir ve onu proxy methodu ile dikkatlice aldığı belirli .NET tiplerine göre XML yanıtına çevirir. Birçok yazılım geliştiri için Web servisi çağırma işinde .NET Framework kullanmak birçok kolaylık sağlar. Şu anki servis odaklı uygulamaların bu kadar yaygın kullanılmasının nedeni de budur.

ASP.NET 2.0 AJAX eklentileri ile aynı deneyimi, Web servisler için aynı proxy jenerasyonunu ve kullanıcı taraflı JavaScript kullanarak da yaşayacaksınız. Kullanıcı taraflı bir JavaScript sınıfı üzerinden verilen servis boyunca methotlar çağırabilir ve bunu sunucunuz üzerinde bir .asmx dosyası olarak tutabilirsiniz. Örneğin, asağıdaki basit .asmx servisi, rastgele veriler ile stok kotasını çekiyor.

StockQuoteService.asmx
 

Standart .asmx Web servisi özelliklerine ek olarak, bu servis, ScriptService özelliği ile JavaScript kullanıcılarına da olanak sağlayacak şekilde donatılabilir. Eğer bu .asmx dosyası ASP.NET AJAX uyumlu bir Web uygulamasına yerleştirilseydi, .aspx dosyanızın içinde ScriptManager kontrolüne (Visual Studio içinde ASP.NET AJAX uyumlu bir Web sitesi template i kullanarak bir web sitesi yarattığınızda; bu kontrol otomatik olarak default.aspx sayfanıza eklenir) ServiceReference i ekleyerek JavaScript ile servis metotlarını çağırabilirdiniz.

Şimdi herhangi bir JavaScript kullanarak, servis üzerinden herhangi bir metot çağırabilmek için MsdnMagazine.StockQuoteService sınıfını kullanabilirsiniz. Çalıştırma için gerekli tüm mekanizma esas olarak asenkronize olduğu için, hiçbir senkronize methot yoktur. Bunun yerine her bir proxy, metot tamamlandığında; asenkronize olarak çağrılacak diğer kullanıcı taraflı JavaScript fonksiyonuna referans olacak tek bir ekstra parametre alır (standart girdi parametreleri boyunca). Aşağıda, sayfa içindeki etikete (span) çağrılan web servisinin döndürdüğü sonucu yazan kullanıcı taraflı bir JavaScript kullanan bir sayfayı görebilirsiniz.

Web Servisi Örnek Sayfası

 

Kullanıcı taraflı bir web servisi çağırdığınızda herhangi birşey yanlış giderse, kesinlikle kullanıcının bunu bilmesine izin vermek istersiniz. Bu yüzden de, genellikle hata varsa ya da oturum süresi asılmışsa bunu farklı bir methot içinde çağırarak gösteririz. Örneğin, bir önceki gösterilen OnLookup metodunu aşağıdaki şekilde değiştirerek; ve ona ek OnError metodu ekleyerek; herhangi bir hatayı gösterebiliriz.

Bu yolla, eğer web servis çağrınız başarısız olursa, kullanıcıyı bir alert box ile uyarabileceksiniz. Dilediğiniz şekilde userContext parametresini de ekleyebilirsiniz. Aşağıda, OnLookupComplete metodu içinde userContext olarak istenen stoğun gerçek sembolünü geçirdiğimizi görebilirsiniz.

Eğer web servise birçok farklı çağrı yapıyorsanız ve aynı hata ve başarı metotlarını her bir çağrı için yeniden kullanmak isterseniz, varsayılan olarak ve her yerde kullanabileceğiniz hata ve başarı callback metotları oluşturabilirsiniz. Bu her seferinde çağrı yaptığınızda bir çift callback yapmanızdan kaçınmanızı sağlar. Aşağıda, varsayılan ve global olarak ayarlanmış, hata ve başarı callback methotlarını çağıran OnLookup metodu örneğini görebilirsiniz.

Web servis metotlarınız için .asmx dosyası oluşturmada bir diğer ilginç alternatif ise, sayfa sınıfı içine direkt olarak web servis metotlarını gömmektir. Çağırmak istediğiniz methotlar için bütün halinde bir web servis yazmak sizin için bir anlam ifade etmiyorsa, sayfanıza sunucu taraflı bir method ekleyerek (ister direkt olarak sayfaya gömülü isterseniz codebehind olarak) kullanıcı taraflı JavaScript ten çağrılabilir bir sayfadan web metodunuzu çalıştırabilir ve onu WebMethod özelliği ile ilişkilendirebilirsiniz. O zaman, kullanıcı taraflı bir nesne olan PageMethods ile onu çalıştırabileceksiniz. Aşağıdaki örnek, stok kotası servisini ayrı bir web servisi yerine bütünüyle tek bir sayfada nasıl yazılabileceğini gösteriyor.

Tek Sayfada Stok Kotası Servisi

 

Burada unutulmaması gereken şey, bu kullanıcı taraflı proxy ler sadece ASP.NET .asmx dosyalarından, Windows Communication Foundation .svc uzantılı dosyalardan, ya da direkt olarak web sayfasına gömülü WebMethods lardan üretilebilir ve Web servisi çağırmak için genel bir mekanizma değildir. Aslında XmlHTTPRequest nesnesinden kaynaklanan (güvenlik nedeniyle) genel bir kısıtlama söz konusudur. Eğer harici bir Web servis çağırma gereği duyarsanız, harici web servisi için en iyi çözüm .NET proxy sınıfı (wsdl.exe ile ya da Visual Studio içinde Add Web Reference ile üretilen) çağıran uygulamanız ve .asmx uzantılı dosyalarınız için bir köprü oluşturmaktır.

Bu makalede, ASP.NET 2.0 AJAX eklentili sayfalarda, kullanıcı taraflı JavaScript kullanarak; sunucu taraflı Web servislerini nasıl kullanabileceğimizi gördük. İki seriden oluşan bu dizinin ikinci makalesinde ise, bu işlemlerinin nasıl çalıştığına ve serialization a ayrıntıları ile hep birlikte bakacağız.

Bir sonraki makalelerde görüşmek üzere. İyi çalışmalar...


Tayfun AKCAY

tayfun@tayfunakcay.com