Makale Özeti

Serinin bu ikinci makalesinde, ASP.NET 2.0 AJAX eklentili sayfalarda, kullanıcı taraflı JavaScript kullanarak; sunucu taraflı Web servislerinin nasıl çalıştığına ve serialization a ayrıntıları ile bakacağız.

Makale

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

Bu İşlem Nasıl Çalışıyor?

İlk bakışta, standart .asmx Web servisini alıp ona JavaScript ile kullanıcı tarafından ve browser içerisinden erişmenin hemen hemen hiçbir değişikliğin gelmediği yanılgısına düşürür bizi. Asıl gizem ise, ASP.NET AJAX destekli Web sitelerinin her birinin konfigürasyon dosyasına eklenen yeni .asmx HTTP handler ın içinde yatar.

Bu yeni handler, eğer .asmx uzantılı bir dosyadan yapılan standart bir web servisi istemi ise, standart web servis handler (System.Web.Services.Protocols.WebServiceHandlerFactory) ını çalıştıracaktır. Fakat eğer istek URL içinde /js ile izlenirse ya da sorgu mn= değisken (örneğin, ?mn= GetStockQuote) gibi bir ifade içerirse, handler, ya web servisi (/js seçenekli olan) için kullanıcı taraflı bir proxy yaratan bir JavaScript parçası döndürür ya da WebService türevli bir sınıf içinde tanımlı bir metodu çalıştırır ve JavaScript Object Notation (JSON) içinde istemi kodlanmış olarak paketler (?mn seçenekli olan).

Sayfa, .asmx servisine kullanıcı taraflı bir referans eklediğinde (ScriptManager kontrolü içinde ServiceReference elementi), kullanıcı tarafında proxy yaratarak; /js ekiyle .asmx dosyasına referans edilmiş bir script elementi enjekte eder. Örnek olarak, daha önceki makale hazırladığımız stok kotası sayfasını aşağıdaki script elementi ile yeniden çalıştıralım.

İşte bu, ek olarak; bu proxy ile etkileşime geçmek için gerekli kullanıcı taraflı özellikleri içeren Microsoft AJAX kütüphaneleri için bir script referansıdır. Bunu ayrıntılı bir şekilde incelemeye kalktığınızda, aşağıdaki JavaScript i göreceksiniz.

Bu JavaScript, ScriptManager kontrolünü içeren her bir sayfaya eklenmiş Microsoft AJAX kütüphanelerinin özelliklerini (namespaces ve WebMethod sınıfı gibi) kullanır. Bu JavaScript ile yaratılan proxy metodu, burada ?mn=GetStockQuote sorgu ifadesiyle .asmx i çağırır ve çalıştırır. Böylece, kullanıcı tarafından MsdnMagazine.StockQuoteService.GetStockQuote i çağırdığınız zaman, aynı .asmx için bu asenkronize bir web istemine dönüşür. Bu kullanıcı taraflı proxy jennerasyonu ve JavaScript için sunucu taraflı desteğin kombinasyonu Web servisi çağrılarını başlatır. Bunun anlamı, kullanıcı taraflı çağrılarınızı kendi .asmx web servislerinize bir yolla ekleyebilirsiniz.

Serialization

AJAX tabanlı web servisleri için varsayılan serialization JSON dur. Son bölümde gösterilen sayfanın trace ine bakacak olursak, web servis istemi ve cevabının omurgası aşağıdaki gibi olacaktır.

Bu normal .asmx Web servislerinizi çağırdığınızda muhtemelen görmeye alışık olduğunuz standart XML formatı kesinlikle değildir. .asmx XML içine seri halde dizmek üzere yapıldığı için, ASP.NET 2.0 AJAX eklentilerine eklenen en önemli eklentilerden biri de JSON serializer ıdır. Aslında onlardan iki tane vardır. Biri, kullanıcı tarafında kullanım için JavaScript içinde implemente edilmiştir. Diğeri de, özellikle AJAX kullanıcısı .asmx i çalıştırdığında; sunucu tarafında kullanılmak üzere .NET içinde implemente edilmiştir. Sunucu taraflı serialize Microsoft.Web.Script.Serialization.JavaScriptSerializer içinde hazırdır zaten. Kullanıcı taraflı serializer ise Sys.Serialization.JavaScriptSerializer içinde mevcuttur. XML üzerinden serialization formatı olarak JSON kullanmanın en önemli özelliklerinden biri de basit bir şekilde JSON ifadesini yorumlayarak JavaScript içinde nesneleri tekrar deserialize edebilmedir. Kullanıcı taraflı serializer sınıfının deserialize methodu çok kısa olarak (hata kotrolü kaldırılmış olarak) gelir.

Standart web servislerinde XML i düzenlemek için kullanılan XmlSerializer gibi JavaScriptSerializer ile de JSON içinde hemen hemen bütün .NET tiplerini düzenleyebilirsiniz. Kendi başınıza denemek isterseniz, yapmanız gereken tek şey JavaScriptSerializer sınıfı içinde Serialize metodunu çağırmaktır. Aşağıdaki örnek konsol uygulamasını karmaşık Person tipini nasıl çevirdiğini örnek olarak inceleyebilirsiniz (ASP.NET AJAX eklentileriyle Global Assembly Cache (GAC) içinde Microsoft.Web.Extensions.dll yüklü assembly referansını içeriyor olması gerekir).

JSON Serialization Konsol Uygulaması
 
Örnek Person Tipi
 

Konsol uygulamasının ekran çıktısı JSON formatında Person sınıfı olabilir ya da:

XmlSerializer gibi, JavaScriptSerializer da sadece tip içinde erişilebilir veriyi dönüştürebilir. Fakat standart .asmx web servisi tarafından çevrilen her bir tip, bu serializer ile çalışır (DataSet ler dahil). Artık bu bilgi ile, sizde daha karmaşık web servisleri oluşturabilirsiniz.

Aşağıdaki örnekte gösterilen MarriageService adlı web servisi, iki Person nesnesini (daha önceden oluşturduğumuz) alarak Marry metodunu çalıştırır ve uygun bir şekilde özelliklerini değiştirir.

MarriageService.asmx
 

Kullanıcı taraflı scriptinizde XML ile çalışmak isterseniz, başka bir seçenek de mevcuttur. Web servislerini tanımlarken kullanılan standart WebMethod özelliğine ek olarak, Microsoft.Web.Script.Services isim uzayı içinde ScriptMethod diye tanımlanan JSON or XML olarak ayarlanabilen (varsayılan olarak JSON gelir) ResponseFormat özelliğine sahip yeni bir özellik daha vardır.

Bu dönüştürülmüş istek o zaman;

gibi olacaktır.

Bu metodu çağırdığınızda, kullanıcı taraflı JavaScript ile XML istemini yakalamak tamamen size bağlıdır. Onun üzerinde dönüşümler ile çalışmayı planlıyor ya da çoktan MSXML kullanıyorsanız, bu yararlı olabilir.

Özet

Sonuç olarak, kesinlikle belirtmekte yarar var ki ASP.NET 2.0 AJAX eklentileri kullanıcı taraflı kodlar ve özel ASP.NET 2.0 uygulama servisleri için iki önemli servis sağlar. ProfileService ve AuthenicationService. Bu iki kullanıcı taraflı proxy sınıfları ile, tekil kullanıcılar için profil değerleri üretebilir, ayarlayabilir ve hatta doğrulama (varsayılan Membership sağlayıcısı ile) gerçekleştirebilirsiniz ve bütün doğrulama cookie lerini tamamı ile kullanıcı script inde kabul edebilirsiniz. Şu ana kadar bilinen yüzüyle hep ASP.NET 2.0 AJAX eklentilerinin kullanıcı arayüzlerine getirdiği canlılık ön plandaydı. Bana göre ise en parlak ve kullanışlı özellikler ise direkt olarak kullanıcı tarafında JavaScript kullanarak Web servislerini çağırabilme yetenekleridir. .NET Framework/JSON serializer ile, bilinen .asmx web servislerine direkt entegrasyon ile, kümeleme desteği ve harici web servisleri için otomatik olarak üretilen köprüler ile ve web servisleri için getirdiği bu inanılmaz yararlı ve anlamlı destek ile; bence tüm özelliklerinin yanında bu, belki de AJAX ın önemli özelliğidir.

Bu makale serisinin ilkinde, ASP.NET 2.0 AJAX eklentili sayfalarda, kullanıcı taraflı JavaScript kullanarak; sunucu taraflı Web servislerini nasıl kullanabileceğimizi; ikincisinde ise, bu işlemlerinin nasıl çalıştığına ve serialization a ayrıntıları ile hep birlikte baktık. AJAX hayatımıza sadece görsel anlamda bir şeyler katmadığını; ötesinde daha nice özellikleri barındırdığına hep birlikte şahit olduk.

Kaynak: MSDN

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


Tayfun AKCAY

tayfun@tayfunakcay.com