Serveur interop avec WCF et JSON, c’est possible…
Régulièrement, je reçois des mails, me défiant de fournir un service WCF interopérable. Aux yeux de certains, WCF ne sait pas être compatible avec des clients Java, PHP, JavaScript car il ne respecterait pas les standards. Heureusement, ce n’est pas vrai!
D’expérience, dans 90% des cas, le Binding n’était pas bien choisi (ou alors il est mal configuré). Dans les 10% restants, c’est le client qui fait mal son travail.
Dernièrement, il m’a été communiqué un code JavaScript qui ne fonctionnait pas avec un service WCF utilisant pourtant bien un webHttpBinding.
Avec ce code, on m’a joint la remarque : « WCF ne sait pas lire du json ! »
Après activation modification du fichier de configuration pour que WCF retourne un message d’erreur :
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
Je constate que WCF me dit trouvé un caractère « simple cote » là où il attend un « double cote ». Après recherche sur json, je suis tombé sur un paire d’articles :
Oh la belle surprise, il y a un RFC sur json qui dit qu’une propriété doit être entourées de « doubles cotes ».
Or le client utilise le « simple cote ».
Donc: le code suivant = pas bien !
$.ajax({
type: "POST",
url: "/MonService.svc/MaMethode",
contentType: "application/json; charset=utf-8",
data: "{‘name’: " + userName + ", ‘firstname’: " + userFirstname + "}",
success: successCallBack,
error: ajaxCallBack
})
Le code suivant = bien !
$.ajax({
type: "POST",
url: "/MonService.svc/MaMethode",
contentType: "application/json; charset=utf-8",
data: "{\"name\": " + userName + ", \"firstname\": " + userFirstname + "}",
success: successCallBack,
error: ajaxCallBack
})
Moralité, encore une fois WCF a bien respecté la norme. Dans le cas présent, il la respecte même strictement et n’accepte pas un client non respectueux de celle-ci.
Après tests sur un service web ASMX, j’ai constaté que celui-ci était plus permissif et supportait le « simple cote ». D’où les problèmes de migration de certain lors du passage à WCF.