SharePoint et les HttpModules - 2/3

Pour la suite de cette série sur SharePoint et les HttpModules (flashback), je vais vous expliquer (voire réexpliquer pour ceux qui ont assisté à ma session sur "comment étendre sa plateforme SharePoint 2007" lors des TechDays) une autre manière de les utiliser.

Le 2ème intérêt de ces modules c'est d'intercepter et d'altérer la réponse renvoyée au navigateur. En effet, il existe un événement, "ReleaseRequestState", qui intervient après la récupération de toutes les informations de la requête et surtout qui va nous permettre d'utiliser les "Filters".

La technique est la suivante :

  • s'abonner à cet événement dans la méthode Init : 
  • public void Init(HttpApplication context)
    {
       context.ReleaseRequestState += 
    new EventHandler(context_ReleaseRequestState); }
  • dans l'événement, passer notre classe dérivant d'un "Stream" et implémentant la méthode "Write" à la propriété Filter du HttpResponse pour pouvoir modifier le flux de sortie :
void context_ReleaseRequestState(object sender, EventArgs e)
{
   response.Filter = new MyPageFilter(response.Filter);
}
  • l'implémentation de ce filtre tient surtout à la méthode Write. Voici un court exemple (pas forcément le plus pertinent) avec un simple replace d'un mot clé par un autre :

    public override void Write(byte[] buffer, int offset, int count)
    {
       // Récupération du buffer (attention aux flux non UTF-8)
       string strBuffer = 
    System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); // Remplacement strBuffer =
    strBuffer.Replace("MOSS", "Microsoft Office SharePoint Server"); strBuffer =
    strBuffer.Replace("WSS", "Windows SharePoint Services"); // Recopie des données en sortie byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(strBuffer); responseStream.Write(data, 0, data.Length); }

Bien sûr, on en profitera pour y insérer quelques tests histoire de ne pas utiliser inutilement ce mécanisme et éviter au maximum les impacts sur les performances de votre serveur web.

Vous trouverez plus d'explications grâce aux articles suivants:

Au final, nous changeons ainsi le code HTML renvoyé par SharePoint et du coup effectuer des modifications de l'interface sans avoir à toucher les pages originales (car tout le monde sait que changer les pages standard, c'est mal !). Je vous invite aussi à jeter un oeil sur ce projet CodePlex : Macaw SharePoint Skinner qui introduisait déjà ces concepts en modifiant le look des pages renvoyées par SharePoint (version 2003 à l'époque).

Dans le prochain et dernier billet sur les modules HTTP, je proposerai un projet complet d'altération du contenu avec quelques cas pratiques à l'appui, ainsi qu'une installation made in SharePoint.

Gat, SPModule again

[Warning] Comme me l'a fait justement remarqué Renaud, je n'ai pas assez mis en avant l'impact sur les performances. Je l'avais plus évoqué durant la session aux TechDays, mais sachez que les modules ont un impact sur les performances puisqu'ils vont se retrouver appelés pour toutes les requêtes effectuées sur le serveur. Evitez donc le trop et gardez son utilisation pour des cas bien spécifiques et pour lesquels la perte en terme de performance est palliée par la fonctionnalité apportée par le module.

 

Commentaires

Le 25 Aug 2008 06:12, pierre a dit:

"Dans le prochain et dernier billet sur les modules HTTP"

il n'est jamais venu le dernier billet ?

:)

(à prendre avec le sourire, je sais ce que c'est...)

Le 03 Sep 2008 02:27, Gat a dit:

Effectivement, je n'ai jamais eu le temps de le rédiger. En fait, cette troisième partie correspond à une des session que j'ai présentée aux TechDays 2008.

Un jour, qui sait, je finirai par faire un post dessus ! (mais je me suis promis de ne plus jamais faire d'articles en plusieurs parties :p)

Laisser un commentaire





Validation Image CAPTCHA