Modification header HTTP d'une requête Ajax vers un service WCF / ASMX Ajax
Lorsque l'on fait une requête vers un service WCF / ASMX "Ajax enabled" il se peut que l'on ait besoin de passer des paramètres qui ne sont pas propres à la méthode, par exemple un ticket d'authentification, ...
Ajout d'un paramètre dans le header de la requête (donc coté client) :
Pour ajouter un paramètre dans le header HTTP de la requête il faut s'abonner à l'événement invokingRequest.
Sys.Net.WebRequestManager.add_invokingRequest(function(){
e._webRequest._headers['CacheID'] = ...
});
Côté serveur on peut relire le paramètre via :
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public List<Person> GetPersons()
{
Guid cacheID = Guid.Empty;
try
{
cacheID = new Guid(HttpContext.Current.Request.Headers["CacheID"]);
}
catch
{
cacheID = Guid.NewGuid();
}
}
Ajout d'un paramètre dans le header de la réponse (donc côté serveur) :
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public List<Person> GetPersons()
{
// ...
HttpContext.Current.Response.AddHeader("CacheID", cacheID.ToString());
}
Ensuite pour lire ce paramètre côté client :
DataService.GetPersons(function(persons){
var cacheID = null;
try {
// ca ressemble à un bug Atlas ...
cacheID = this._WSRequest._executor.getResponseHeader('CacheID');
} catch (ex) {
}
// ...
});
Je me suis servi de cette astuce pour gérer une sorte de cache, session cliente afin de ne pas renvoyer les informations que le serveur m'avait déjà envoyé.