Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

OutputCache et les fichiers .browser – ou comment un UserAgent peut nuire à votre site web

Afin d’optimiser les performances d’une application web, une des bonnes pratiques consiste à rajouter du cache sur les pages ou contrôle utilisateur via la directive @OutputCache. Cette directive permet de mettre le rendu HTML de la page en cache.

Après avoir fait cette opération et passé le site en production, de temps en temps, de façon aléatoire, le HTML que retournait le serveur ne contenait pas les scripts JavaScript propres à ASP.net : fonction __doPostBack , champs cachés __EVENTTARGET, webResources et scriptResource … Je n’ai jamais réussi à reproduire ce comportement sur une plate-forme autre que la production.

Après une séance de décompilation dans Reflector, je me suis rendu compte que ces scripts étaient inclus en fonction du navigateur exécutant la page (Request.Browser).

// pseudo code internal void BeginFormRender(HtmlTextWriter writer, string formUniqueID){ if (this.ClientSupportsJavaScript){ this.RenderPostBackScript(writer, formUniqueID); } } internal bool ClientSupportsJavaScript { get { if (!this._clientSupportsJavaScriptChecked) { this._clientSupportsJavaScript = (this._request != null) && (this._request.Browser.EcmaScriptVersion >= JavascriptMinimumVersion); this._clientSupportsJavaScriptChecked = true; } return this._clientSupportsJavaScript; } }

ASP.net génère la variable Browser à partir du UserAgent du navigateur ainsi que des fichiers .browser de votre site web. Par défaut, un site web ASP.net “hérite” des fichiers .browser du dossier %Windows%\Microsoft.NET\Framework\v2.0.50727\CONFIG\Browsers. Pour certains UserAgent (principalement les robots/crawler), la propriété ClientSupportsJavaScript retourne false.

Du coup, si votre cache est généré à partir d’une requête provenant d’un UserAgent ne supportant pas JavaScript, les scripts ne seront pas inclut pour cette requête. Cependant le rendu HTML de la page sera ajouté au cache et renvoyé pour tous les navigateurs.

Afin de résoudre ce problème, la solution la plus simple est de faire varier votre cache en fonction du type de navigateur. Pour cela, nous pouvons utiliser l’attribut VaryByCustom de la directive OutputCache. Lorsque cet attribut est renseigné, ASP.net va interroger la méthode GetVaryByCustomString du global.asax, cette méthode doit retourner un string servant de clé de cache pour la valeur envoyée.

L’implémentation par défaut contient déjà du code répondant au paramètre browser :

// code provenant de Reflector public class HttpApplication { // ... public virtual string GetVaryByCustomString(HttpContext context, string custom) { if (StringUtil.EqualsIgnoreCase(custom, "browser")) { return context.Request.Browser.Type; } return null; } }

Ainsi, si l’on souhaite faire varier le cache en fonction du navigateur il suffit de rajouter la valeur browser à l’attribut VaryByCustom de la directive OutputCache.

<%@ OutputCache Duration="60" VaryByParam="none" VaryByCustom="browser" %>

Le cache sera alors différent en fonction du navigateur : IE, Firefox, mobile, … Si ce comportement ne vous satisfait pas, vous pouvez surcharger la méthode GetVaryByCustomString du global.asax et réécrire le code pour avoir un cache unique sur les principaux navigateurs.

Comme expliqué sur mon précédent poste (OutputCache et ScriptManager – Attention, seul le rendu est caché), l’attribut OutputCache ne fait que cacher le rendu HTML, ASP.net possède un mécanisme permettant de faire varier le HTML en fonction du navigateur, à nous alors de faire attention à ce que l’on met en cache et comment le cache doit varier.

Et vous, avez vous déjà rencontré des problèmes similaires ?

Posted: dimanche 20 décembre 2009 23:26 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

emmanuel.roulle a dit :

Pour le browser, il n'est même pas nécessaire de surcharger la méthode : http://msdn.microsoft.com/en-us/library/system.web.httpapplication.getvarybycustomstring.aspx

La clef "browser" est déjà prise en charge dans la méthode parente.

# décembre 22, 2009 08:49

cyril a dit :

oui, c'est bien ce que je dis :)

Tu es le 2ème à me faire cette remarque, j'ai légerement modifié le post pour être plus explicite.

# décembre 22, 2009 16:58

Billou_13 a dit :

Post super intéressant !

Je ne connaissais pas cette subtilité avec ASP.Net.

Surtout qu'on prend vite l'habitude de mettre le paramètre OutputCache sans assez tester son fonctionnement.

Merci Cyril de partager cette info avec nous.

# janvier 8, 2010 14:51

Nicodemus a dit :

Un article bien intéressant. Je viens justement de poster un billet sur le nouveau système de mise en cache avec ASP.NET 4 (http://www.nicolasesprit.com/post/2010/03/08/ASPNet-40-Extensible-Output-Caching.aspx). J'en profite pour mettre un lien vers le tien car c'est bon à savoir !

# mars 9, 2010 01:12
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01