Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Scott Cate
Web Hizmetleri, dağıtılmış sistemler arasında veri alışverişi için platformlar arası bir çözüm sağlayan .NET çerçevesinin ayrılmaz bir parçasıdır. Web Hizmetleri normalde farklı işletim sistemlerinin, nesne modellerinin ve programlama dillerinin veri gönderip almasına izin vermek için kullanılsa da, verileri bir ASP.NET AJAX sayfasına dinamik olarak eklemek veya bir sayfadan arka uç sistemine veri göndermek için de kullanılabilir. Tüm bunlar geri gönderme işlemlerine başvurmadan yapılabilir.
ASP.NET AJAX ile Web Hizmetlerini çağırma
Dan Wahlin
Web Hizmetleri, dağıtılmış sistemler arasında veri alışverişi için platformlar arası bir çözüm sağlayan .NET çerçevesinin ayrılmaz bir parçasıdır. Web Hizmetleri normalde farklı işletim sistemlerinin, nesne modellerinin ve programlama dillerinin veri gönderip almasına izin vermek için kullanılsa da, verileri bir ASP.NET AJAX sayfasına dinamik olarak eklemek veya bir sayfadan arka uç sistemine veri göndermek için de kullanılabilir. Tüm bunlar geri gönderme işlemlerine başvurmadan yapılabilir.
ASP.NET AJAX UpdatePanel denetimi, AJAX'ın herhangi bir ASP.NET sayfasını etkinleştirmesi için basit bir yol sağlar, ancak bazı durumlarda UpdatePanel kullanmadan sunucudaki verilere dinamik olarak erişmeniz gerekebilir. Bu makalede, ASP.NET AJAX sayfalarında Web Hizmetleri oluşturup kullanarak bunu nasıl gerçekleştirebileceğinizi göreceksiniz.
Bu makale, AJAX Uzantıları'nın temel ASP.NET kullanılabilen işlevlere ve AutoCompleteExtender adlı ASP.NET AJAX Araç Seti'nde Web Hizmeti etkin denetimine odaklanacaktır. AJAX özellikli Web Hizmetleri tanımlama, istemci proxy'leri oluşturma ve JavaScript ile Web Hizmetlerini çağırma konuları ele alınmıştır. Ayrıca Web Hizmeti çağrılarının doğrudan ASP.NET sayfa yöntemlerine nasıl yapılabildiğini de göreceksiniz.
Web Hizmetleri Yapılandırması
Visual Studio 2008 ile yeni bir Web Sitesi projesi oluşturulduğunda, web.config dosyasında Visual Studio'nun önceki sürümlerini kullananlara yabancı olabilecek bir dizi yeni ekleme vardır. Bu değişikliklerden bazıları "asp" ön ekini ASP.NET AJAX denetimleriyle eşler, böylece bunlar sayfalarda kullanılırken, diğerleri gerekli HttpHandler'ları ve HttpModule'leri tanımlar. Liste 1'de web.config öğesinde yapılan <httpHandlers>
ve Web Hizmeti çağrılarını etkileyen değişiklikler gösterilir. .asmx çağrılarını işlemek için kullanılan varsayılan HttpHandler kaldırılır ve System.Web.Extensions.dll derlemesinde bulunan bir ScriptHandlerFactory sınıfıyla değiştirilir. System.Web.Extensions.dll, ASP.NET AJAX tarafından kullanılan tüm temel işlevleri içerir.
Liste 1. AJAX Web Hizmeti İşleyici Yapılandırmasını ASP.NET
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false"
type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35"/>
</httpHandlers>
Bu HttpHandler değişikliği, JavaScript Web Hizmeti proxy'si kullanılarak ASP.NET AJAX sayfalarından .NET Web Hizmetleri'ne JavaScript Nesne Gösterimi (JSON) çağrılarının yapılmasına izin vermek için yapılır. ASP.NET AJAX, genellikle Web Hizmetleri ile ilişkili standart Basit Nesne Erişim Protokolü (SOAP) çağrılarının aksine Web Hizmetlerine JSON iletileri gönderir. Bu, genel olarak daha küçük istek ve yanıt iletilerine neden olur. Ayrıca ASP.NET AJAX JavaScript kitaplığı JSON nesneleriyle çalışacak şekilde iyileştirildiğinden verilerin istemci tarafında daha verimli işlenmesine de olanak tanır. Liste 2 ve Liste 3'de, JSON biçiminde seri hale getirilmiş Web Hizmeti isteği ve yanıt iletileri örnekleri gösterilir. Liste 2'de gösterilen istek iletisi "Belçika" değerine sahip bir ülke parametresi geçirirken, Liste 3'teki yanıt iletisi bir Müşteri nesneleri dizisini ve bunların ilişkili özelliklerini geçirir.
Liste 2. JSON'a Seri Hale Getirilmiş Web Hizmeti İstek İletisi
{"country":"Belgium"}
> [! NOT] işlem adı, web hizmetinin URL'sinin bir parçası olarak tanımlanır; Ayrıca, istek iletileri her zaman JSON aracılığıyla gönderilmez. Web Hizmetleri, UseHttpGet parametresi true olarak ayarlanmış ScriptMethod özniteliğini kullanabilir ve bu da parametrelerin sorgu dizesi parametreleri aracılığıyla geçirilmesine neden olur.
Liste 3. JSON'a Seri Hale Getirilmiş Web Hizmeti Yanıt İletisi
[{"__type":"Model.Customer","Country":"Belgium","CompanyName":"Maison
Dewey","CustomerID":"MAISD","ContactName":"Catherine
Dewey"},{"__type":"Model.Customer","Country":"Belgium","CompanyName":"Suprêmes
délices","CustomerID":"SUPRD","ContactName":"Pascale
Cartrain"}]
Sonraki bölümde, JSON istek iletilerini işleyebilecek ve hem basit hem de karmaşık türlerle yanıt verebilen Web Hizmetleri'nin nasıl oluşturulacağını göreceksiniz.
AJAX Özellikli Web Hizmetleri Oluşturma
ASP.NET AJAX çerçevesi, Web Hizmetlerini çağırmak için çeşitli yollar sağlar. AutoCompleteExtender denetimini (ASP.NET AJAX Toolkit'te kullanılabilir) veya JavaScript'i kullanabilirsiniz. Ancak, bir hizmeti çağırmadan önce istemci betik kodu tarafından çağrılabilmesi için AJAX-etkinleştirmeniz gerekir.
Web Hizmetleri'ni ASP.NET yeni olup olmadığınıza bakılmaksızın, AJAX'ı etkinleştiren hizmetler oluşturmayı kolay bulacaksınız. .NET framework, 2002'deki ilk sürümünden bu yana ASP.NET Web Hizmetleri oluşturulmasını desteklemiştir ve ASP.NET AJAX Uzantıları, .NET framework'ün varsayılan özellik kümesini kullanan ek AJAX işlevleri sağlar. Visual Studio .NET 2008 Beta 2, .asmx Web Hizmeti dosyaları oluşturmak için yerleşik desteğe sahiptir ve System.Web.Services.WebService sınıfından sınıfların yanına otomatik olarak ilişkili kod türetir. Sınıfa yöntemler eklerken, Web Hizmeti tüketicileri tarafından çağrılmaları için WebMethod özniteliğini uygulamanız gerekir.
Liste 4'te, WebMethod özniteliğini GetCustomersByCountry() adlı bir yönteme uygulama örneği gösterilmektedir.
Liste 4. Web Hizmetinde WebMethod Özniteliğini Kullanma
[WebMethod]
public Customer[] GetCustomersByCountry(string country)
{
return Biz.BAL.GetCustomersByCountry(country);
}
GetCustomersByCountry() yöntemi bir ülke parametresi kabul eder ve bir Customer nesne dizisi döndürür. yöntemine geçirilen ülke değeri, veritabanından verileri almak, Customer nesne özelliklerini verilerle doldurmak ve diziyi döndürmek için bir veri katmanı sınıfı çağıran bir iş katmanı sınıfına iletilir.
ScriptService Özniteliğini Kullanma
WebMethod özniteliğini eklemek GetCustomersByCountry() yönteminin Web Hizmetine standart SOAP iletileri gönderen istemciler tarafından çağrılmasına izin verirken, ASP.NET AJAX uygulamalarından JSON çağrılarının kullanıma hazır olmasına izin vermez. JSON çağrılarının yapılmasına izin vermek için ASP.NET AJAX Uzantısının ScriptService
özniteliğini Web Hizmeti sınıfına uygulamanız gerekir. Bu, Bir Web Hizmetinin JSON kullanılarak biçimlendirilmiş yanıt iletileri göndermesini sağlar ve istemci tarafı betiğinin JSON iletileri göndererek bir hizmeti çağırmasına olanak tanır.
Liste 5'te, ScriptService özniteliğini CustomersService adlı bir Web Hizmeti sınıfına uygulama örneği gösterilmektedir.
Liste 5. Web Hizmetini AJAX ile etkinleştirmek için ScriptService Özniteliğini Kullanma
[System.Web.Script.Services.ScriptService]
[WebService(Namespace = "http://xmlforasp.net")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class CustomersService : System.Web.Services.WebService
{
[WebMethod]
public Customer[] GetCustomersByCountry(string country)
{
return Biz.BAL.GetCustomersByCountry(country);
}
}
ScriptService özniteliği, AJAX betik kodundan çağrılabileceğini belirten bir işaretçi işlevi görür. Aslında arka planda gerçekleşen JSON serileştirme veya seri durumdan çıkarma görevlerinin hiçbirini işlemez. ScriptHandlerFactory (web.config içinde yapılandırılır) ve diğer ilgili sınıflar JSON işlemenin büyük bir kısmını yapar.
ScriptMethod Özniteliğini Kullanma
ScriptService özniteliği, bir .NET Web Hizmetinde ASP.NET AJAX sayfaları tarafından kullanılması için tanımlanması gereken tek ASP.NET AJAX özniteliğidir. Ancak ScriptMethod adlı başka bir öznitelik de bir hizmetteki Web Yöntemlerine doğrudan uygulanabilir. ScriptMethod, ResponseFormat
ve XmlSerializeString
dahil olmak üzere UseHttpGet
üç özellik tanımlar. Web Yöntemi tarafından kabul edilen istek türünün GET olarak değiştirilmesi gerektiğinde, Web Yönteminin bir veya XmlElement
nesnesi biçiminde ham XML verileri döndürmesi gerektiğinde veya hizmetten döndürülen verilerin her zaman JSON yerine XML olarak serileştirilmesi gerektiğinde, bu özelliklerin XmlDocument
değerlerinin değiştirilmesi yararlı olabilir.
UseHttpGet özelliği, web yönteminin POST istekleri yerine GET isteklerini kabul etmesi gerektiğinde kullanılabilir. İstekler, QueryString parametrelerine dönüştürülen Web Yöntemi giriş parametrelerine sahip bir URL kullanılarak gönderilir. UseHttpGet özelliği varsayılan olarak false olarak ayarlanır ve yalnızca işlemlerin güvenli olduğu bilindiğinde ve hassas veriler bir Web Hizmetine geçirilmediğinde olarak ayarlanmalıdır true
. Liste 6'da, UseHttpGet özelliğiyle ScriptMethod özniteliğini kullanma örneği gösterilmektedir.
Liste 6. UseHttpGet özelliğiyle ScriptMethod özniteliğini kullanma.
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string HttpGetEcho(string input)
{
return input;
}
Liste 6'da gösterilen HttpGetEcho Web Yöntemi çağrıldığında gönderilen üst bilgilerin bir örneği aşağıda gösterilmiştir:
GET /CustomerViewer/DemoService.asmx/HttpGetEcho?input=%22Input Value%22 HTTP/1.1
Web Yöntemlerinin HTTP GET isteklerini kabul etmelerine izin vermenin yanı sıra, JSON yerine bir hizmetten XML yanıtları döndürülmek gerektiğinde ScriptMethod özniteliği de kullanılabilir. Örneğin, bir Web Hizmeti uzak bir siteden RSS akışı alabilir ve bunu XmlDocument veya XmlElement nesnesi olarak döndürebilir. Xml verilerinin işlenmesi daha sonra istemcide gerçekleşebilir.
Liste 7'de, XML verilerinin bir Web Yönteminden döndürülmesi gerektiğini belirtmek için ResponseFormat özelliğini kullanma örneği gösterilmektedir.
Liste 7. ScriptMethod özniteliğini ResponseFormat özelliğiyle kullanma.
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml)]
public XmlElement GetRssFeed(string url)
{
XmlDocument doc = new XmlDocument();
doc.Load(url);
return doc.DocumentElement;
}
ResponseFormat özelliği, XmlSerializeString özelliğiyle birlikte de kullanılabilir. XmlSerializeString özelliğinin varsayılan değeri false'tur; başka bir deyişle, bir Web Yönteminden döndürülen dizeler dışındaki tüm dönüş türleri, özelliği olarak ayarlandığında ResponseFormat.Xml
XML ResponseFormat
olarak serileştirilir. XmlSerializeString
olarak ayarlandığındatrue
, bir Web Yönteminden döndürülen tüm türler, dize türleri de dahil olmak üzere XML olarak serileştirilir. ResponseFormat özelliği XmlSerializeString özelliğinin ResponseFormat.Json
değerine sahipse yoksayılır.
Liste 8'de, dizelerin XML olarak seri hale getirilmeye zorlanması için XmlSerializeString özelliğinin kullanılmasına ilişkin bir örnek gösterilmektedir.
Liste 8. ScriptMethod özniteliğini XmlSerializeString özelliğiyle kullanma
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Xml,XmlSerializeString=true)]
public string GetXmlString(string input)
{
return input;
}
Liste 8'de gösterilen GetXmlString Web Yöntemini çağırarak döndürülen değer aşağıda gösterilmiştir:
<?xml version="1.0"?>
<string>Test</string>
Varsayılan JSON biçimi, istek ve yanıt iletilerinin genel boyutunu en aza indirgese ve ASP.NET AJAX istemcileri tarafından tarayıcılar arası bir şekilde daha hazır kullanılsa da, Internet Explorer 5 veya üzeri gibi istemci uygulamaları xml verilerinin bir Web Yönteminden döndürülmesini beklediğinde ResponseFormat ve XmlSerializeString özellikleri kullanılabilir.
Karmaşık Türlerle Çalışma
Liste 5'de, Web Hizmetinden Customer adlı karmaşık bir türü döndürme örneği gösterilmiştir. Customer sınıfı, FirstName ve LastName gibi özellikler olarak dahili olarak birkaç farklı basit tür tanımlar. AJAX özellikli web yönteminde giriş parametresi veya dönüş türü olarak kullanılan karmaşık türler, istemci tarafına gönderilmeden önce otomatik olarak JSON olarak serileştirilir. Ancak, iç içe yerleştirilmiş karmaşık türler (başka bir tür içinde dahili olarak tanımlananlar) istemcinin varsayılan olarak tek başına nesneler olarak kullanılabilir duruma getirilmemesidir.
Bir Web Hizmeti tarafından kullanılan iç içe karmaşık türün istemci sayfasında da kullanılması gerektiğinde, ASP.NET AJAX GenerateScriptType özniteliği Web Hizmetine eklenebilir. Örneğin, Liste 9'da gösterilen CustomerDetails sınıfı, iç içe karmaşık türleri temsil eden Adres ve Cinsiyet özelliklerini içerir.
Liste 9. Burada gösterilen CustomerDetails sınıfı iki iç içe karmaşık tür içerir.
public class CustomerDetails : Customer
{
public CustomerDetails()
{
}
Address _Address;
Gender _Gender = Gender.Unknown;
public Address Address
{
get { return _Address; }
set { _Address = value; }
}
public Gender Gender
{
get { return _Gender; }
set { _Gender = value; }
}
}
Listeleme 9'da gösterilen CustomerDetails sınıfı içinde tanımlanan Address ve Gender nesneleri, iç içe türler olduğundan JavaScript aracılığıyla istemci tarafında otomatik olarak kullanılamaz (Adres bir sınıf ve Gender bir numaralandırmadır). Web Hizmeti içinde kullanılan iç içe türün istemci tarafında kullanılabilir olması gereken durumlarda, daha önce bahsedilen GenerateScriptType özniteliği kullanılabilir (bkz. Listeleme 10). Bir hizmetten farklı iç içe karmaşık türlerin döndürüldüğü durumlarda bu öznitelik birden çok kez eklenebilir. Doğrudan Web Hizmeti sınıfına veya belirli Web Yöntemlerinin üzerine uygulanabilir.
Liste 10. İstemci tarafından kullanılabilir olması gereken iç içe türleri tanımlamak için GenerateScriptService özniteliğini kullanma.
[System.Web.Script.Services.ScriptService]
[System.Web.Script.Services.GenerateScriptType(typeof(Address))]
[System.Web.Script.Services.GenerateScriptType(typeof(Gender))]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class NestedComplexTypeService : System.Web.Services.WebService
{
//Web Methods
}
Özniteliği Web Hizmetine uygulanarak GenerateScriptType
, Adres ve Cinsiyet türleri otomatik olarak istemci tarafı ASP.NET AJAX JavaScript kodu tarafından kullanılabilir hale getirilecektir. Web Hizmetine GenerateScriptType özniteliği eklenerek otomatik olarak oluşturulan ve istemciye gönderilen JavaScript örneği Listeleme 11'de gösterilmiştir. Makalenin devamında iç içe karmaşık türlerin nasıl kullanılacağını göreceksiniz.
Liste 11. bir ASP.NET AJAX sayfasında kullanılabilir hale gelen iç içe yerleştirilmiş karmaşık türler.
if (typeof(Model.Address) === 'undefined')
{
Model.Address=gtc("Model.Address");
Model.Address.registerClass('Model.Address');
}
Model.Gender = function() { throw Error.invalidOperation(); }
Model.Gender.prototype = {Unknown: 0,Male: 1,Female: 2}
Model.Gender.registerEnum('Model.Gender', true);
Web Hizmetleri oluşturmayı ve bunları AJAX sayfaları ASP.NET erişilebilir hale getirmeyi gördüğünüze göre, şimdi verilerin alınabilmesi veya Web Hizmetlerine gönderilebilmesi için JavaScript proxy'leri oluşturma ve kullanma adımlarını inceleyelim.
JavaScript Proxy'leri oluşturma
Standart bir Web Hizmetini (.NET veya başka bir platform) çağırmak genellikle sizi SOAP isteği ve yanıt iletileri gönderme karmaşıklıklarından koruma sağlayan bir proxy nesnesi oluşturmayı içerir. ASP.NET AJAX Web Hizmeti çağrılarıyla JavaScript proxy'leri oluşturulabilir ve JSON iletilerini seri hale getirme ve seri durumdan çıkarma konusunda endişelenmeden hizmetleri kolayca çağırmak için kullanılabilir. JavaScript proxy'leri ASP.NET AJAX ScriptManager denetimi kullanılarak otomatik olarak oluşturulabilir.
Web Hizmetlerini çağırabilen bir JavaScript proxy'si oluşturmak, ScriptManager'ın Services özelliği kullanılarak gerçekleştirilir. Bu özellik, bir ASP.NET AJAX sayfasının geri gönderme işlemlerine gerek kalmadan veri göndermek veya almak için zaman uyumsuz olarak çağırabileceği bir veya daha fazla hizmet tanımlamanızı sağlar. ASP.NET AJAX ServiceReference
denetimini kullanarak ve Web Hizmeti URL'sini Path
denetimin özelliğine atayarak bir hizmet tanımlarsınız. 12 listesinde CustomersService.asmx adlı bir hizmete başvuru örneği gösterilmektedir.
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/CustomersService.asmx" />
</Services>
</asp:ScriptManager>
Liste 12. ASP.NET AJAX sayfasında kullanılan bir Web Hizmeti tanımlama.
ScriptManager denetimi aracılığıyla CustomersService.asmx dosyasına başvuru eklemek, sayfa tarafından dinamik olarak bir JavaScript proxy'si oluşturulmasına ve başvurulmaya neden olur. Proxy, betik> etiketi kullanılarak <eklenir ve CustomersService.asmx dosyası çağrılarak ve sonuna /js eklenerek dinamik olarak yüklenir. Aşağıdaki örnekte, web.config dosyasında hata ayıklama devre dışı bırakıldığında JavaScript proxy'sinin sayfaya nasıl ekli olduğu gösterilmektedir:
<script src="CustomersService.asmx/js" type="text/javascript"></script>
> [! NOT] Oluşturulan gerçek JavaScript proxy kodunu görmek isterseniz, internet explorer'ın adres kutusuna istenen .NET Web Hizmetinin URL'sini yazabilir ve sonuna /js ekleyebilirsiniz.
Web.config dosyasında hata ayıklama etkinleştirildiyse, JavaScript proxy'sinin hata ayıklama sürümü sonraki bölümlerde gösterildiği gibi sayfaya eklenir:
<script src="CustomersService.asmx/jsdebug" type="text/javascript"></script>
ScriptManager tarafından oluşturulan JavaScript proxy'si, betik> etiketinin src özniteliği kullanılarak başvurulmak yerine doğrudan sayfaya <da eklenebilir. Bu, ServiceReference denetiminin InlineScript özelliğini true (varsayılan değer false) olarak ayarlayarak yapılabilir. Bu, bir ara sunucu birden çok sayfada paylaşılmadığında ve sunucuya yapılan ağ çağrılarının sayısını azaltmak istediğinizde yararlı olabilir. InlineScript true olarak ayarlandığında proxy betiği tarayıcı tarafından önbelleğe alınmaz, bu nedenle proxy'nin bir ASP.NET AJAX uygulamasında birden çok sayfa tarafından kullanıldığı durumlarda varsayılan false değeri önerilir. InlineScript özelliğini kullanma örneği aşağıda gösterilmiştir:
<asp:ServiceReference InlineScript="true" Path="~/CustomersService.asmx"/>
JavaScript Proxy'lerini kullanma
ScriptManager denetimi kullanılarak bir web hizmetine ASP.NET AJAX sayfası tarafından başvuruldıktan sonra, Web Hizmetine bir çağrı yapılabilir ve döndürülen veriler geri çağırma işlevleri kullanılarak işlenebilir. Web Hizmeti, ad alanına (varsa), sınıf adına ve Web Yöntemi adına başvurarak çağrılır. Web Hizmetine geçirilen tüm parametreler, döndürülen verileri işleyen bir geri çağırma işleviyle birlikte tanımlanabilir.
Liste 13'te GetCustomersByCountry() adlı bir Web Yöntemini çağırmak için JavaScript proxy'si kullanma örneği gösterilmiştir. Son kullanıcı sayfadaki bir düğmeye tıkladığında GetCustomersByCountry() işlevi çağrılır.
Liste 13. JavaScript proxy'si ile Web Hizmeti çağırma.
function GetCustomerByCountry()
{
var country = $get("txtCountry").value;
InterfaceTraining.CustomersService.GetCustomersByCountry(country, OnWSRequestComplete);
}
function OnWSRequestComplete(results)
{
if (results != null)
{
CreateCustomersTable(results);
GetMap(results);
}
}
Bu çağrı, hizmette tanımlanan InterfaceTraining ad alanına, CustomersService sınıfına ve GetCustomersByCountry Web Yöntemine başvurur. Zaman uyumsuz Web Hizmeti çağrısı döndürdüğünde çağrılacak OnWSRequestComplete adlı bir geri çağırma işlevinin yanı sıra metin kutusundan alınan ülke değerini geçirir. OnWSRequestComplete, hizmetten döndürülen Customer nesneleri dizisini işler ve bunları sayfada görüntülenen bir tabloya dönüştürür. Çağrıdan oluşturulan çıkış Şekil 1'de gösterilir.
Şekil 1: Bir Web Hizmetine zaman uyumsuz AJAX çağrısı yaparak alınan verileri bağlama. (Tam boyutlu görüntüyü görüntülemek için tıklayın)
JavaScript proxy'leri, web yönteminin çağrılması ancak proxy'nin yanıt beklememesi gereken durumlarda Web Hizmetleri'ne tek yönlü çağrılar da yapabilir. Örneğin, iş akışı gibi bir işlemi başlatmak için bir Web Hizmeti çağırmak isteyebilirsiniz, ancak hizmetten bir dönüş değeri beklememek isteyebilirsiniz. Bir hizmete tek yönlü çağrı yapılması gereken durumlarda, Listeleme 13'te gösterilen geri çağırma işlevi atlanabilir. Hiçbir geri çağırma işlevi tanımlanmadığından, proxy nesnesi Web Hizmetinin veri döndürmesini beklemez.
Hataları İşleme
Web Hizmetleri'ne zaman uyumsuz geri çağırmalar ağ çalışmıyor, Web Hizmeti kullanılamıyor veya bir özel durum döndürülüyor gibi farklı türlerde hatalarla karşılaşabilir. Neyse ki ScriptManager tarafından oluşturulan JavaScript proxy nesneleri, daha önce gösterilen başarı geri çağırmasına ek olarak hataları ve hataları işlemek için birden çok geri çağırmanın tanımlanmasına olanak sağlar. Hata geri çağırma işlevi, Liste 14'te gösterildiği gibi Web Yöntemi çağrısında standart geri çağırma işlevinden hemen sonra tanımlanabilir.
Liste 14. Bir hata geri çağırma işlevi tanımlama ve hataları görüntüleme.
function GetCustomersByCountry()
{
var country = $get("txtCountry").value;
InterfaceTraining.CustomersService.GetCustomersByCountry(country,
OnWSRequestComplete, OnWSRequestFailed);
}
function OnWSRequestFailed(error)
{
alert("Stack Trace: " + error.get_stackTrace() + "/r/n" +
"Error: " + error.get_message() + "/r/n" +
"Status Code: " + error.get_statusCode() + "/r/n" +
"Exception Type: " + error.get_exceptionType() + "/r/n" +
"Timed Out: " + error.get_timedOut());
}
Web Hizmeti çağrıldığında oluşan hatalar, hatayı parametre olarak temsil eden bir nesneyi kabul eden OnWSRequestFailed() geri çağırma işlevinin çağrılacağını tetikler. Hata nesnesi, hem hatanın nedenini hem de çağrının zaman aşımına uğradı mı olmadığını belirlemek için birkaç farklı işlevi kullanıma sunar. Liste 14'de farklı hata işlevlerinin kullanıldığı bir örnek, Şekil 2'de ise işlevler tarafından oluşturulan çıktının bir örneği gösterilmektedir.
Şekil 2: AJAX hata işlevleri ASP.NET çağrılarak oluşturulan çıktı. (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Web Hizmetinden Döndürülen XML Verilerini İşleme
Daha önce, Bir Web Yönteminin ResponseFormat özelliğiyle birlikte ScriptMethod özniteliğini kullanarak ham XML verilerini nasıl döndürebileceğini gördünüz. ResponseFormat ResponseFormat.Xml olarak ayarlandığında, Web Hizmetinden döndürülen veriler JSON yerine XML olarak serileştirilir. Xml verilerinin JavaScript veya XSLT kullanılarak işlenmesi için doğrudan istemciye geçirilmesi gerektiğinde bu yararlı olabilir. Şu anda Internet Explorer 5 veya üzeri, YERLEŞIK MSXML desteği nedeniyle XML verilerini ayrıştırmak ve filtrelemek için en iyi istemci tarafı nesne modelini sağlar.
Bir Web Hizmetinden XML verilerini almak, diğer veri türlerini almaktan farklı değildir. Uygun işlevi çağırmak ve bir geri çağırma işlevi tanımlamak için JavaScript proxy'sini çağırarak başlayın. Çağrı döndürdüğünde, geri çağırma işlevindeki verileri işleyebilirsiniz.
15'in listelenmesinde, XmlElement nesnesi döndüren GetRssFeed() adlı bir Web Yöntemini çağırma örneği gösterilmektedir. GetRssFeed() alınacak RSS akışının URL'sini temsil eden tek bir parametreyi kabul eder.
Liste 15. Web Hizmetinden döndürülen XML verileriyle çalışma.
function GetRss()
{
InterfaceTraining.DemoService.GetRssFeed(
"https://blogs.interfacett.com/dan-wahlins-blog/rss.xml",
OnWSRequestComplete);
}
function OnWSRequestComplete(result)
{
if (document.all) //Filter for IE DOM since other browsers are limited
{
var items = result.selectNodes("//item");
for (var i=0;i<items.length;i++)
{
var title = items[i].selectSingleNode("title").text;
var href = items[i].selectSingleNode("link").text;
$get("divOutput").innerHTML +=
"<a href='" + href + "'>" + title + "</a><br/>";
}
}
else
{
$get("divOutput").innerHTML = "RSS only available in IE5+";
}
}
Bu örnek, BIR RSS akışına BIR URL geçirir ve Döndürülen XML verilerini OnWSRequestComplete() işlevinde işler. OnWSRequestComplete() önce tarayıcının MsXML ayrıştırıcısının kullanılabilir olup olmadığını öğrenmek için Internet Explorer olup olmadığını denetler. Bu durumda, RSS akışındaki tüm <öğe> etiketlerini bulmak için bir XPath deyimi kullanılır. Ardından her öğe yinelenir ve ilişkili <başlık> ve <bağlantı> etiketleri her öğenin verilerini görüntülemek için bulunur ve işlenir. Şekil 3'de, GetRssFeed() Web Yöntemine javascript ara sunucusu aracılığıyla ASP.NET AJAX çağrısı yapılarak oluşturulan çıktının bir örneği gösterilmektedir.
Karmaşık Türleri İşleme
Web Hizmeti tarafından kabul edilen veya döndürülen karmaşık türler bir JavaScript ara sunucusu aracılığıyla otomatik olarak kullanıma sunulur. Ancak, önceden açıklandığı gibi hizmete GenerateScriptType özniteliği uygulanmadığı sürece iç içe yerleştirilmiş karmaşık türler istemci tarafında doğrudan erişilemez. İstemci tarafında neden iç içe yerleştirilmiş karmaşık bir tür kullanmak istersiniz?
Bu soruyu yanıtlamak için ASP.NET AJAX sayfasının müşteri verilerini görüntülediğini ve son kullanıcıların müşterinin adresini güncelleştirmesine izin verdiği varsayılır. Web Hizmeti, Adres türünün (CustomerDetails sınıfı içinde tanımlanan karmaşık bir tür) istemciye gönderilebileceğini belirtirse, daha iyi kod yeniden kullanımı için güncelleştirme işlemi ayrı işlevlere ayrılabilir.
Şekil 3: RSS verilerini döndüren bir Web Hizmeti çağrılarak oluşturulan çıkış. (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Liste 16'da, Model ad alanında tanımlanan bir Address nesnesini çağıran, güncelleştirilmiş verilerle dolduran ve bir CustomerDetails nesnesinin Address özelliğine atayan istemci tarafı kod örneği gösterilmektedir. CustomerDetails nesnesi daha sonra işlenmek üzere Web Hizmetine geçirilir.
Liste 16. İç içe karmaşık türleri kullanma
function UpdateAddress()
{
var cust = new Model.CustomerDetails();
cust.CustomerID = $get("hidCustomerID").value;
cust.Address = CreateAddress();
InterfaceTraining.DemoService.UpdateAddress(cust,OnWSUpdateComplete);
}
function CreateAddress()
{
var addr = new Model.Address();
addr.Street = $get("txtStreet").value;
addr.City = $get("txtCity").value;
addr.State = $get("txtState").value;
return addr;
}
function OnWSUpdateComplete(result)
{
alert("Update " + ((result)?"succeeded":"failed")+ "!");
}
Sayfa Yöntemlerini Oluşturma ve Kullanma
Web Hizmetleri, yeniden kullanılabilir hizmetleri ASP.NET AJAX sayfaları da dahil olmak üzere çeşitli istemcilere sunmak için mükemmel bir yol sağlar. Ancak, bir sayfanın başka sayfalar tarafından hiç kullanılmayacak veya paylaşılmayan verileri alması gereken durumlar olabilir. Bu durumda, sayfanın verilere erişmesine izin vermek için bir .asmx dosyası oluşturmak, hizmet yalnızca tek bir sayfa tarafından kullanıldığından aşırı yükleme gibi görünebilir.
ASP.NET AJAX, tek başına .asmx dosyaları oluşturmadan Web Hizmeti benzeri çağrılar yapmak için başka bir mekanizma sağlar. Bu, "sayfa yöntemleri" olarak adlandırılan bir teknik kullanılarak yapılır. Sayfa yöntemleri, doğrudan webmethod özniteliğinin uygulandığı bir sayfaya veya kod yanındaki dosyaya eklenmiş statik (VB.NET paylaşılan) yöntemlerdir. WebMethod özniteliği uygulanarak, çalışma zamanında dinamik olarak oluşturulan PageMethods adlı özel bir JavaScript nesnesi kullanılarak çağrılabilir. PageMethods nesnesi, sizi JSON serileştirme/seri durumdan çıkarma işleminden koruma sağlayan bir proxy işlevi görür. PageMethods nesnesini kullanmak için ScriptManager'ın EnablePageMethods özelliğini true olarak ayarlamanız gerektiğini unutmayın.
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>
17'nin listelenmesi, bir ASP.NET yanında kod sınıfında iki sayfa yöntemi tanımlama örneğini gösterir. Bu yöntemler, Web Sitesinin App_Code klasöründe bulunan bir iş katmanı sınıfından veri alır.
Liste 17. Sayfa yöntemlerini tanımlama.
[WebMethod]
public static Customer[] GetCustomersByCountry(string country)
{
return Biz.BAL.GetCustomersByCountry(country);
}
[WebMethod]
public static Customer[] GetCustomersByID(string id)
{
return Biz.BAL.GetCustomersByID(id);
}
ScriptManager sayfada Web Yöntemlerinin varlığını algıladığında, daha önce bahsedilen PageMethods nesnesine dinamik bir başvuru oluşturur. Web Yöntemini çağırmak, PageMethods sınıfına başvurarak ve ardından yöntemin adı ve geçirilmesi gereken tüm gerekli parametre verileriyle gerçekleştirilir. 18'in listelenmesinde, daha önce gösterilen iki sayfa yöntemini çağırma örnekleri gösterilir.
Liste 18. PageMethods JavaScript nesnesiyle sayfa yöntemlerini çağırma.
function GetCustomerByCountry()
{
var country = $get("txtCountry").value;
PageMethods.GetCustomersByCountry(country, OnWSRequestComplete);
}
function GetCustomerByID()
{
var custID = $get("txtCustomerID").value;
PageMethods.GetCustomersByID(custID, OnWSRequestComplete);
}
function OnWSRequestComplete(results)
{
var searchResults = $get("searchResults");
searchResults.control.set_data(results);
if (results != null) GetMap(results[0].Country,results);
}
PageMethods nesnesinin kullanılması JavaScript proxy nesnesi kullanımına çok benzer. Önce sayfa yöntemine geçirilmesi gereken tüm parametre verilerini belirtir ve ardından zaman uyumsuz çağrı döndürdüğünde çağrılması gereken geri çağırma işlevini tanımlarsınız. Hata geri çağırma da belirtilebilir (hata işleme örnekleri için Listeleme 14'e bakın).
AutoCompleteExtender ve ASP.NET AJAX Araç Seti
ASP.NET AJAX Araç Seti ('den https://github.com/DevExpress/AjaxControlToolkitkullanılabilir), Web Hizmetlerine erişmek için kullanılabilecek çeşitli denetimler sunar. Özellikle araç seti, Herhangi bir JavaScript kodu yazmadan Web Hizmetleri'ni çağırmak ve sayfalardaki verileri göstermek için kullanılabilecek adlı AutoCompleteExtender
kullanışlı bir denetim içerir.
AutoCompleteExtender denetimi, bir metin kutusunun mevcut işlevselliğini genişletmek ve kullanıcıların aradıkları verileri daha kolay bulmasına yardımcı olmak için kullanılabilir. Metin kutusuna yazarken, denetim web hizmetini sorgulamak için kullanılabilir ve sonuçları metin kutusunun altında dinamik olarak gösterir. Şekil 4'de, bir destek uygulamasının müşteri kimliklerini görüntülemek için AutoCompleteExtender denetimini kullanma örneği gösterilmektedir. Kullanıcı metin kutusuna farklı karakterler yazarken, girişlerine göre altında farklı öğeler gösterilir. Kullanıcılar daha sonra istenen müşteri kimliğini seçebilir.
AutoCompleteExtender'ın ASP.NET AJAX sayfasında kullanılması, AjaxControlToolkit.dll derlemesinin Web Sitesinin bin klasörüne eklenmesini gerektirir. Araç seti derlemesi eklendikten sonra, içerdiği denetimlerin bir uygulamadaki tüm sayfalarda kullanılabilir olması için web.config dosyasında buna başvurmak isteyeceksiniz. Bu, web.config'in <denetim> etiketine aşağıdaki etiketi ekleyerek yapılabilir:
<add namespace="AjaxControlToolkit" assembly="AjaxControlToolkit" tagPrefix="ajaxToolkit"/>
Denetimi yalnızca belirli bir sayfada kullanmanız gereken durumlarda, web.config dosyasını güncelleştirmek yerine sayfanın en üstüne Başvuru yönergesini ekleyerek başvurabilirsiniz:
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
TagPrefix="ajaxToolkit" %>
Şekil 4: AutoCompleteExtender denetimini kullanma. (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Web Sitesi ASP.NET AJAX Araç Seti'ni kullanacak şekilde yapılandırıldıktan sonra, normal bir ASP.NET sunucu denetimi eklediğiniz gibi sayfaya bir AutoCompleteExtender denetimi eklenebilir. 19 numaralı listede, web hizmetini çağırmak için denetimi kullanma örneği gösterilmektedir.
Liste 19. ASP.NET AJAX Toolkit AutoCompleteExtender denetimini kullanma.
<ajaxToolkit:AutoCompleteExtender ID="extTxtCustomerID" runat="server"
MinimumPrefixLength="1" ServiceMethod="GetCustomerIDs"
ServicePath="~/CustomersService.asmx"
TargetControlID="txtCustomerID" />
AutoCompleteExtender, sunucu denetimlerinde bulunan standart kimlik ve runat özellikleri de dahil olmak üzere birkaç farklı özelliğe sahiptir. Bunlara ek olarak, Web Hizmeti veriler için sorgulanmadan önce bir son kullanıcının kaç karakter yazılacağını tanımlamanızı sağlar. Listeleme 19'da gösterilen MinimumPrefixLength özelliği, metin kutusuna her karakter yazıldığı zaman hizmetin çağrılmaya neden olur. Kullanıcı her karakter yazdığınızda, metin kutusundaki karakterlerle eşleşen değerleri aramak için Web Hizmeti çağrılacağı için bu değeri ayarlarken dikkatli olmanız gerekir. Çağrılacak Web Hizmeti ve hedef Web Yöntemi sırasıyla ServicePath ve ServiceMethod özellikleri kullanılarak tanımlanır. Son olarak, TargetControlID özelliği AutoCompleteExtender denetiminin hangi metin kutusuna bağlanacaklarını tanımlar.
Çağrılan Web Hizmeti'nin daha önce açıklandığı gibi ScriptService özniteliğinin uygulanmış olması ve hedef Web Yönteminin prefixText ve count adlı iki parametreyi kabul etmesi gerekir. prefixText parametresi son kullanıcı tarafından yazılan karakterleri, count parametresi ise kaç öğe döndürüleceğini gösterir (varsayılan değer 10'dur). Liste 20'de, Daha önce Listeleme 19'da gösterilen AutoCompleteExtender denetimi tarafından çağrılan GetCustomerIDs Web Yöntemi örneği gösterilmektedir. Web Yöntemi, verileri filtrelemeyi ve eşleşen sonuçları döndürmeyi işleyen bir veri katmanı yöntemi çağıran bir iş katmanı yöntemini çağırır. Veri katmanı yönteminin kodu Listeleme 21'de gösterilir.
Liste 20. AutoCompleteExtender denetiminden gönderilen verileri filtreleme.
[WebMethod]
public string[] GetCustomerIDs(string prefixText, int count)
{
return Biz.BAL.GetCustomerIDs(prefixText, count);
}
Liste 21. Sonuçları son kullanıcı girişlerine göre filtreleme.
public static string[] GetCustomerIDs(string prefixText, int count)
{
//Customer IDs cached in _CustomerIDs field to improve performance
if (_CustomerIDs == null)
{
List<string> ids = new List<string>();
//SQL text used for simplicity...recommend using sprocs
string sql = "SELECT CustomerID FROM Customers";
DbConnection conn = GetDBConnection();
conn.Open();
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = sql;
DbDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
ids.Add(reader["CustomerID"].ToString());
}
reader.Close();
conn.Close();
_CustomerIDs = ids.ToArray();
}
int index = Array.BinarySearch(_CustomerIDs, prefixText, new CaseInsensitiveComparer());
//~ is bitwise complement (reverse each bit)
if (index < 0) index = ~index;
int matchingCount;
for (matchingCount = 0; matchingCount < count && index + matchingCount < _CustomerIDs.Length; matchingCount++)
{
if (!_CustomerIDs[index + matchingCount].StartsWith(prefixText, StringComparison.CurrentCultureIgnoreCase))
{
break;
}
}
String[] returnValue = new string[matchingCount];
if (matchingCount > 0)
{
Array.Copy(_CustomerIDs, index, returnValue, 0, matchingCount);
}
return returnValue;
}
Sonuç
ASP.NET AJAX, istek ve yanıt iletilerini işlemek için çok fazla özel JavaScript kodu yazmadan Web Hizmetlerini çağırmak için mükemmel destek sağlar. Bu makalede, AJAX'ın JSON iletilerini işlemesini sağlamak için .NET Web Hizmetlerini etkinleştirmeyi ve ScriptManager denetimini kullanarak JavaScript proxy'lerini tanımlamayı gördünüz. JavaScript proxy'lerinin Web Hizmetlerini çağırmak, basit ve karmaşık türleri işlemek ve hatalarla başa çıkmak için nasıl kullanılabileceğini de gördünüz. Son olarak, Web Hizmeti çağrıları oluşturma ve yapma sürecini basitleştirmek için sayfa yöntemlerinin nasıl kullanılabileceğini ve AutoCompleteExtender denetiminin son kullanıcılara yazarken nasıl yardım sağlayabileceğini gördünüz. ASP.NET AJAX'ta kullanılabilen UpdatePanel, basitliği nedeniyle birçok AJAX programcısı için kesinlikle tercih edilecek bir denetim olacaktır, ancak JavaScript proxy'leri aracılığıyla Web Hizmetlerini çağırmayı bilmek birçok uygulamada yararlı olabilir.
Biyografi
Dan Wahlin (ASP.NET ve XML Web Hizmetleri için Microsoft En Değerli Profesyonel), Arabirim Teknik Eğitimi'nde (http://www.interfacett.com) bir .NET geliştirme eğitmeni ve mimari danışmanıdır. Dan, ASP.NET Developers Web sitesi (www.XMLforASP.NET) için XML'yi kurdu, INETA Konuşmacı Bürosu'nda yer alır ve çeşitli konferanslarda konuşur. Dan birlikte yazılmış Professional Windows DNA (Wrox), ASP.NET: İpuçları, Öğreticiler ve Kod (Sams), ASP.NET 1.1 Insider Solutions, Professional ASP.NET 2.0 AJAX (Wrox), ASP.NET 2.0 MVP Hacks ve ASP.NET Developers (Sams) için yazılmış XML). Kod, makale veya kitap yazmadığı zamanlarda Dan, karısı ve çocuklarıyla müzik yazıp kaydetmeyi, golf ve basketbol oynamayı seviyor.
Scott Cate, 1997 yılından beri Microsoft Web teknolojileriyle çalışmaktadır ve Bilgi Bankası Yazılımı çözümlerine odaklanan ASP.NET tabanlı uygulamalar yazma konusunda uzmanlaştığı myKB.com (www.myKB.com) Başkanıdır. Scott ile ScottCate.com adresinden scott.cate@myKB.com veya blogundan e-posta yoluyla iletişim kurulabilir