Con l'avvento di ASP.NET AJAX 1.0, l'uso dei webservice asmx per popolare contenuti delle pagine in modo asincrono, almeno nel mio caso sta godendo di un notevole favore. Trovo davvero proficuo l'uso di questo metodo perchè alleggerisce notevolmente il roundtrip verso il server facendo transitare il minimo indispensabile. Credo ormai tutti sappiano come si fa a mettere una referenza e a sfruttare un webservice, perciò non tornerò su questo argomento (a meno che non me lo chiediate...) ma vorrei invece sollevare un caso pratico.

Poniamo di realizzare uno ScriptControl, utilizzando l'interfaccia IScriptControl. Questo controllo sfrutta un webservice per popolare il controllo (pensate ad esempio ai nodi di un albero). Anzichè mettere la referenza al WebService hardcoded sarebbe opportuno usare una coppia si proprietà alla stregua di quello che fa il Control Toolkit nel controllo AutoComplete.

/* ... omissis ... */ private string servicePath; private string serviceMethod; public string ServicePath { get { return this.servicePath; } set { this.servicePath = value; } } public string ServiceMethod { get { return this.serviceMethod; } set { this.serviceMethod = value; } } /* ... omissis ... */

Assodato che ServiceMethod deve per forza implementare una determinata firma ben conosciuta tra client e server, ecco come fare a chiamare questo metodo in modo dinamico senza mettere una referenza nello ScriptManager. il primo passo è esportare le proprietà nella parte client dello ScriptControl:

/* ... omissis ... */ public IEnumerable<ScriptDescriptor> GetScriptDescriptors() { ScriptControlDescriptor classDescriptor = new ScriptControlDescriptor("MyControl", this.ClientID); if (!string.IsNullOrEmpty(this.ServicePath)) classDescriptor.AddProperty("servicePath", VirtualPathUtility.ToAbsolute(this.ServicePath)); if (!string.IsNullOrEmpty(this.ServiceMethod)) classDescriptor.AddProperty("serviceMethod", this.ServiceMethod); yield return classDescriptor; } /* ... omissis ... */

in seguito aggiungeremo le proprietà corrispondenti nella parte client, servicePath e serviceMethod che sono valorizzate per mezzo del precedente spezzone di codice:

/* ... omissis ... */ get_servicePath : function() { return this._servicePath; }, set_servicePath : function(value) { this._servicePath = value; }, get_serviceMethod : function() { return this._serviceMethod; }, set_serviceMethod : function(value) { this._serviceMethod = value; }, /* ... omissis ... */

Infine ecco come usare la classe Sys.Net.WebServiceProxy per effettuare la chiamata:

/* ... omissis ... */ Sys.Net.WebServiceProxy.invoke( this.get_servicePath(), this.get_serviceMethod(), false, { mode : this.get_mode()}, Function.createDelegate(this, this._onMethodComplete), Function.createDelegate(this, this._onMethodFailed), null, null); /* ... omissis ... */

in particolare i primi due parametri sono appunto il path del servizio e il metodo da invocare. In seguito si specificano i parametri del metodo con una sintassi JSON, poi ancora i callback consueti per Complete e Failed. Per la documentazione completa del metodo vedere .

Technorati Tag: , , ,

Commenti (1) -

# | Vittorio | 27.02.2009 - 01.30

Come posso usufruire di un servizio asmx funzionante posto su un server aruba da un applicazione silverlight che risiederà sembre sullo stesso server?

grazie

Grassi vittorio

Aggiungi Commento