vendredi 20 mars 2009

Accéder aux variables de session d'une application ASP.NET à partir d'une application Silverlight



L'un des problèmes à qui je devais faire face lorsque je venais de débuter avec silverlight ,c'est de faire passer les variables de session à une application Silverlight. Puisque les Applications silverlight s'exécutent côté client et les variables de sessions vivent côté serveur , les variables de sessions n'étaient pas visible , donc il fallait trouver un moyen pour les faire passer aux Application silverlight et par un moyen sécurisé.

Un des moyens qu'on peut utiliser c'est de passer les variables de sessions à travers le ViewState, sauf qu'utiliser les ViewStates c'est très déstabilisant vu qu'il n'est pas type-safety, peu de données peuvent être transmises et les données sont visibles par les clients.

On aurait aussi pu faire passer les variables de sessions par les Initparameters des Silverlight UserControl mais cela reste limité car on est limité par la taille des données qu'on peut envoyer.

La solution la plus optimale et la plus sécurisé est l'utilisation des service WCF.

Pour pouvoir lire les variables de sessions en utilisant WCF , il faut créer un services qu'on peut appeler service de control et qui a une méthode exposé en tant que OperationContract

Donc pour ce faire , il faut ajouter dans le projet web un nouveau service de type : Silverlight enabled WCF service . "vous pouvez le trouver sous la catégorie Silverlight"

[OperationContract]

public object GetSessionVariable(string key)

{

return System.Web.HttpContext.Current.Session[key];

}

Il faut maintenant ajouter une référence au WCF service qu'on vient de créer.

Fait un re-built de votre solution .

Il faut faire un clique droit sur le projet Silverlight et cliquer sur "Add Service Reference"

Une fois la référence au service ajoutée , il faut instancié une référence du service dans la méthode UserControl_Loaded ou bien dans le constructeur de votre page XAML.

private string userid;

public Page()

{

InitializeComponent();

SessionProvider.SessionProviderClient _clientSession= new SessionProviderClient();

_clientSession.GetSessionVariableCompleted +=

new System.EventHandler(_clientSession_GetSessionVariableCompleted);

// spécification de la méthode à éxecuter quand la méthode GetSessionVariable(string key) du service wcf crée termine son execution.

_clientSession.DoWorkAsync("userid"); // Appel asynchrone pour récuperer la valeur de la variable de session "userid"

}

void _clientSession_GetSessionVariableCompleted(object sender, GetSessionVariableCompletedEventArgs e)

{

userid = (string)e.Result;

}

Vous pouvez maintenant tester l'exemple en affichant le résultat dans un TextBlock par exemple.

4 commentaires:

  1. Bravo Mahmoud! Tres utile ton article :)

    RépondreSupprimer
  2. Arf le css empêche vraiment cet article d'être lisible. Je te conseil de changer la police, la couleur de texte ^^ ou le background. Mais là, obligé de copier sur notepad ^^

    RépondreSupprimer
  3. nk54 at orange fr6 août 2009 à 16:08

    Salut ! Je cherche un moyen de passer des variables d'une page xaml à une autre ! En effet depuis la sortie de silverlight 3, je ne fais plus d'asp.

    Je peux passer qq valeurs via l'URL, mais j'aimerai un moyen plus propre. Donc est-ce possible de créer des variables de session via wcf et les exploiter sans jamais par asp ?

    merci et bon article !
    +1 pour le changement du css ^^

    RépondreSupprimer
  4. Lorsque les services WCF sont hébergés dans une application console ou dans un Service windows le HttpContext.Current.Session est inaccessible il faut alors le partager. Comment faire?

    RépondreSupprimer