Appel ASP.NET AJAX synchrone

Septembre 2016


Introduction


Même si l’acronyme AJAX fait directement référence à un appel asynchrone (Asynchronous JavaScript and XML), on peut avoir besoin dans certains cas d’utiliser toute la technologie siégeant derrière ce terme avec le seul petit détail du fait qu’on veut faire un appel synchrone.
Si jamais le terme AJAX ne colle pas correctement à la fonction voulue, on peut toujours nommer notre technique SJAX (Synchronous JavaScript and XML).

Pré-requis


On suppose que nos lecteurs ont un bon niveau de connaissances avec la plateforme .NET et les technologies ASP.NET et AJAX. En outre, on note qu’on se base dans notre exemple sur le Framework.NET 3.5 avec l’IDE Microsoft Visual Studio 2008.

Définitions


Revenons un peut sur la signification des appellations « AJAX asynchrone » et « AJAX synchrone » ; sachant que lors d’un appel AJAX, l’utilisateur web ne remarque pas un rafraichissement de la page mais observe comme même un dynamisme reflétant une communication avec le serveur. Ce dynamisme a en particulier l’avantage du fait que notre utilisateur peut continuer à exploiter sa page sans être obligé d’attendre les réponses du serveur.
Supposons maintenant qu’on a un cas particulier dans lequel on doit obligatoirement obtenir la réponse du serveur avant de relâcher le processus client. Ceci peut être par exemple le cas d’un « checkbox » dont on veut contrôler la valeur dans l’événement même du click et ce en fonction d’un traitement coté serveur. Pour se faire on doit lancer un appel AJAX dans l’événement de click et attendre la réponse du serveur sans donner la main à l’utilisateur de faire une autre action avant de quitter l’événement. En d’autres termes, l’appel et la réponse au serveur doivent se faire dans le cadre de la même fonction et non dans une fonction en différé comme c’est le cas avec l’appel asynchrone.

Techniques


Bien entendu, on peut toujours chercher à exploiter des solutions d’appel AJAX synchrones non prévues particulièrement pour fonctionner avec ASP.NET mais le problème est qu’on risque avant tout de perdre l’avantage de la simplicité que nous offre la plateforme avec en outre le fait de devoir gérer le standard d’appel des services web en .NET.
Bref, ce qu’on propose c’est plutôt une technique basée sur l’intercalation d’un exécutant de la requête web différent de l’exécutant par défaut qui gère les appels AJAX en ASP.NET. Notre exécutant s'appel « Sys.Net.XMLHttpSyncExecutor » et diffère lors de son exploitation avec ASP.NET de quelques détails près de ce qu’on fait d’habitude avec un appel AJAX asynchrone.

Exploitation


Reprenons notre exemple d’appel asynchrone « HelloWorld » :
ApplicationWebAjax.ServiceWebAjax.HelloWorld(dateDAppel, compteurDAppel, HelloWorld_SucceededCallback, FailedCallback);


Dans ce cas on fait l’appel de la fonction « HelloWorld » présentant deux paramètres et retournant un message sous la forme d’une chaine de caractères. La fonction se trouve sous le service web « ApplicationWebAjax.ServiceWebAjax ».
Si on veut faire de sorte qu’on appelle notre service web d’une manière synchrone, il faut procéder de la manière suivante et ce après avoir fait référence à la classe JavaScript « Sys.Net.XMLHttpSyncExecutor » dans notre page web :
var defaultExecutorType = Sys.Net.WebRequestManager.get_defaultExecutorType();
Sys.Net.WebRequestManager.set_defaultExecutorType("Sys.Net.XMLHttpSyncExecutor");
var request = ApplicationWebAjax.ServiceWebAjax._staticInstance.HelloWorld(dateDAppel, compteurDAppel);
if (request._executor.get_responseAvailable()) {
    var resultat = request._executor.get_object().d;
}
Sys.Net.WebRequestManager.set_defaultExecutorType(defaultExecutorType);


Noter ici qu’on intercale notre exécutant d’appel avec la méthode « set_defaultExecutorType » et qu’on récupère à la fin de notre démarche l’exécutant par défaut afin d’assurer que des éventuels appels postérieures fonctionnes correctement avec le mode asynchrone.
En outre, on remarque que la lecture de la réponse de la fonction ressemble plutôt à du bricolage « request._executor.get_object().d » et de même, il faut passer par « _staticInstance » pour appeler la fonction « HelloWorld ».
Malheureusement, la technique présentée ici n’est pas supposée fonctionner sur toutes les versions des navigateurs web, mais une intervention sur la classe JavaScript « XMLHttpSyncExecutor » pourrait parfaire la solution.
La solution a été testée avec différentes versions d’Internet Explorer et aussi avec des versions peu récentes de Mozilla Firefox.

Conclusion


Même si un bricolage des techniques AJAX ASP.NET nous permet de réaliser un appel synchrone, il est fortement déconseillé de pratiquer de tels appels AJAX que dans les cas extrêmes et surtout avec des requêtes simples et rapides ne nécessitant pas un temps d’occupation important. Sachez en fait que le temps de l’appel notre page web serait bloquée et inexploitable puisque la navigateur demeure actif à attendre la fin de l’interprétation de votre fonction d’appel.

A voir également :

Ce document intitulé «  Appel ASP.NET AJAX synchrone  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.