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

</RSSBandit>

Stanco ormai di ricevere ogni 3×2 un messaggio di errore di RSSBandit che mi indica un errore fatale nel caricamento del file XML contenente i feeds sottoscritti, obbligandomi a caricare una copia di backup (che potrebbe essere non aggiornata) dello stesso file con l’antipatica conseguenza di ritrovarmi con tutti i feeds impostati sullo stato di “Unread” (cosa davvero antipatica se si hanno tanti feeds sottoscritti),  ho deciso di cambiare aggregator. Da oggi sto utilizzando FeedDemon 3 (RC4).

E’ ancora in versione Beta (la versione 3), ma ne parlano molto bene nelle recensioni che ho letto sulla rete.

Inoltre, è possibile sincronizzare i feeds con Google Reader, feature utile se non si utilizza sempre lo stesso PC.

Speriamo di non avere gli stessi problemi avuti con RSSBandit

C# 4.0 – Parametri opzionali

Leggo che tra le nuove feature di C# 4.0 c’è la possibilità di indicare come opzionali i parametri di un metodo o di un costruttore, in tal caso il parametro viene inizializzato con un valore di default fornito dal programmatore.

Una cosa di questo tipo:

public Person(string firstName, string lastName, string city = "")
{    
        //
}

che può essere istanziata in entrambi le modalità:

Person p = new Person("Maurizio", "Tammacco");
Person p1 = new Person("Maurizio", "Tammacco", "Bari");

Nel primo esempio, poichè il parametro “City” è opzionale, viene automaticamente assegnato il valore di default, ovvero stringa vuota in questo caso.

Sinceramente questa nuova funzionalità non mi entusiasma per niente, anzi la ritengo quasi inutile visto che comunque una funzionalità analoga è possibile ottenerla con le “Automatic properties”, ovvero proprietà pubbliche inizializzabili nella stessa istruzione che crea l’istanza di un oggetto, anche se questa funzionalità riguarda comunque un membro definito come proprietà.

I parametri opzionali sono da sempre presenti in Visual Basic, sin dalla versione 6 e poi anche nelle varie versioni .NET. Questo comportava che, in caso di interoperabilità tra i due linguaggi, il codice C# che richiamava un metodo scritto in VB .NET con parametri opzionali era costretto a passargli comunque tutti i parametri, opzionali e non;  la stessa cosa accadeva nell’utilizzo della COM Interop da C#. Adesso non sarà più necessario passare i parametri opzionali, ma, ripeto, a mio avviso l’utilità di questa funzionalità è discutibile, e riguarda unicamente una più stretta compatibilità tra i due linguaggi più usati nel mondo .NET.