Invocazione di metodo remoto da Javascript

A partire da ASP .NET 3.5 è possibile da JavaScript richiamare un metodo esterno, implementato nella stessa pagina aspx che invoca il codice Javascript, oppure in un ASP .NET XML Web Services (per intenderci, quello in formato .asmx), oppure in un WCF Services (in formato .svc), tutto questo senza passare attraverso il normale ciclo di vita della pagina, ma invocando semplicemente un metodo pubblico di una classe, visto che la pagina aspx è una classe a tutti gli effetti.

Al metodo è possibile passare dei parametri e ricevere indietro un valore di ritorno, che sarà serializzato / deserializzato in modalità JSON.

Se si ha la necessità di eseguire codice lato server senza passare dall’intero ciclo di vita della pagine, invocare un metodo pubblico della pagina è sicuramente la soluzione più veloce da implementare, poichè non necessita di creare una applicazione a sè stante (il web service o il WCF Service), e quindi è anche più facile da installare e da manutenere, ma non è esente da limitazioni, la maggiore delle quali è l’impossibilità di richiamare il metodo pubblico da parte di pagine diverse rispetto a quella in cui lo stesso è dichiarato (in tal caso è necessario creare un servizio web, ASP .NET XML Web Service oppure WCF Service).

Di seguito i passi necessari per richiamare un metodo pubblico esposto dalla classe che genera la pagina aspx, da codice Javascript:

  • E’ necessario creare un metodo pubblico e statico all’interno della classe che identifica la pagina aspx e decorarlo con l’attributo System.Web.Services.WebMethodAttribute;
[WebMethod]
public static string GetValueFromServer(string param1, string param2)
{
    return "TEST_RETURN_VALUE";
}
    • E’ necessario assegnare True alla proprietà  EnablePageMethods dell’oggetto ScriptManager ospitato dalla pagina in questione (il valore di default è False), per abilitare l’invocazione di metodi di pagina;
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
  • I due passaggi precedenti fanno in modo che nella pagina aspx sia iniettato del codice di script (inline) che permette di richiamare il “Web Method”. Questo codice di script comprende essenzialmente un oggetto chiamato “PageMethods“, il cui nome è hardcoded e quindi non modificabile, avente metodi statici con lo stesso nome dei metodi statici di pagina, mediante cui è possibile richiamare questi ultimi passando gli opportuni parametri, e indicando una funzione di callback che sarà automaticamente richiamata al termine dell’invocazione del metodo remoto e che conterrà il valore di ritorno di quest’ultimo, piu un metodo di callback opzionale che sarà automaticamente richiamato in caso di errore del metodo remoto.
function Function1 {
    PageMethods.GetValueFromServer( param1, param2, onSuccessfullCall, onErrorCall);
}
  • La funzione di callback richiamata in caso di errore è opzionale. Occorre tener presente che l’invocazione del metodo remoto è asincrona, quindi il controllo tornerà immediatamente al codice Javascript chiamante. Al termine della invocazione del metodo sarà invocata automaticamente la funzione di callback opportuna (chiamata conlusa con successo o con errore). Nel caso di chiamata conclusa con esito positivo, la funzione di callback conterrà anche il valore di ritorno del metodo remoto invocato.
function onSuccessfullCall(results, userContext, methodName) {
    alert(results);
}
 
function onErrorCall(error, userContext, methodName) {
    if (error !== null)
        alert(error.get_message());
}
  • Il parametro results della funzione di callback richiamata in caso di invocazione riuscita conterrà il valore di ritorno del metodo remoto

2 thoughts on “Invocazione di metodo remoto da Javascript

  1. L'articolo è molto utile e interessante, ma non riesco a usare l'oggetto "Cache" di asp.net nel metodo statico, mi dice:
    "Impossibile fare riferimento a un membro di istanza di una classe all'interno di un metodo condiviso o di un inizializzatore di membri condivisi senza un'istanza esplicita della classe.". C'è un modo per usare l'oggetto "Cache"? Grazie Mille!
    Daniele

  2. @Daniele: Ovviamente non è possibile usare l'oggetto Cache in una chiamata di questo tipo, in quanto l'oggetto Cache necessita che la pagina "compia" il suo ciclo di vita abituale interamente. Se vuoi usare la cache dovresti dal metodo pubblico richiamare un servizio esterno (Web Service). Spero di averti tolto ogni dubbio

Leave a Reply

Your email address will not be published. Required fields are marked *