Quand un service Web retourne des objets au format JSON, ces objets sont directement exploitables en JavaScript. C'est une façon productive (mais quick & dirty ?) d'amener les objets métiers du serveur au sein du client léger.
Mais les infos qui concernent la mise en œuvre d'un service Web au format JSON sont assez éparpillées et parfois incorrectes. On peut notamment lire ici ou là qu'un service Web flanqué de l'attribut ScriptMethod se sérialise par défaut au format JSON, ce que l'expérience ne confirme pas.
Voici la recette (qui suppose qu'ASP.NET Ajax est installé sur le serveur et correctement configuré) :
- Ajouter l'attribut ScriptMethod devant la classe de service;
- Spécifier que le binding ne se conforme à aucun profil WS-I via l'attribut WebServiceBinding;
- Devant les méthodes de services, ajouter les attributs WebMethod et ScriptMethod, en spécifiant en paramètre JSON en format de réponse et le cas échéant en autorisant la commande http GET;
- Dans le fichier de config de l'application Web, autoriser les "protocoles" httpget et httppost qui ne sont autorisés par défaut (seul HttpSOAP l'est).
Soit au total :
[WebService(Namespace
= "http://www.denisdollfus.com/WebServices",
Description = "JSON Web service")]
[WebServiceBinding(ConformsTo
= WsiProfiles.None)]
[ScriptService]
public class
JsonServices : System.Web.Services.WebService
{
public JsonServices()
{}
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet=true)]
public SerializableOrder[]
GetTopOrders()
{
DataAccessLayer l_dal = new
DataAccessLayer();
return
l_dal.GetTopOrders();
}
}
Et dans le fichier .config, sous <system.web> :
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
A raffiner en fonction des besoins bien sûr.
Plus d'infos :
Les commentaires récents