ajax_logo
Dans la plate-forme ASP.Net,  un des moyens les plus efficaces pour améliorer la performance de vos applications Web est la mise en cache. Plusieurs méthodes sont proposées, mais la technique la plus simple consiste à ajouter une directive de mise en cache juste sous les directives de page.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="index" Title="dgiw - accueil" %>

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

Ce code constitue la plus simple expression de la directive de mise en cache. Pour plus de détails sur cette technique, consultez la documention sur MSDN.

La seule ombre au tableau lorsqu’on utilise la directive «OutputCache» est qu’elle cohabite mal avec les extensions et les contrôles du AJAX Control Toolkit. Si, par exemple, on tente d’ajouter une extension AutoComplete à un contrôle TextBox dans une page avec une directive «OutputCache», on risque d’avoir le message d’erreur suivant :

Javascript error: AjaxToolkit is undefined.

Lorsqu’une requête est adressée à une page contenant une directive @OutputCache, le code côté-serveur ne sera pas exécuté si la page est déjà mise en cache. À ce moment, seulement le HTML et le code JavaScript mise en cache seront retournés, sans les références aux scripts clients de la librairie AJAX.

Dans la réponse officielle de Microsoft aux nombreuses personnes qui ont signalé ce problème, on explique que l’utilisation de «output cache» combinée aux extensions AJAX et aux classes ScriptManagerProxy, ScriptControl et ScriptReference n’est pas encore supportée. La solution proposée par Microsoft consiste à ajouter une référence aux scripts clients, nécéssaires aux fonctionnalités AJAX, à l’extérieur du contrôle mis en cache. Le hic avec cette proposition c’est qu’elle ne peut s’appliquer quand c’est la page en entier qui est mise en cache.

Il existe toutefois une solution. Normalement, avant de pouvoir utiliser des contrôles AJAX dans vos pages Web, vous devez d’abord y inclure un contrôle ScriptManager qui sert à gérer les scripts et les librairies ASP.NET AJAX. Le truc consiste à remplacer le contrôle ScriptManager par un contrôle ToolkitScriptManager, une version améliorée du ScriptManager contenu dans le AJAX Control Toolkit.

Voici un exemple de l’utilisation du ToolkitScriptManager :

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="index.cs" Inherits="index" %>

<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    Namespace="System.Web.UI" TagPrefix="asp" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

</head>
<body>
    <form id="form1" runat="server">
    <cc1:ToolkitScriptManager ID="ToolkitScriptManager1" CombineScripts="true" CombineScriptsHandlerUrl="/CombineScriptsHandler.ashx" runat="server">
    </cc1:ToolkitScriptManager>

Dans le contrôle ToolkitScriptManager, on délégue la tâche de combiner les scripts au HTTP Handler CombineScriptsHandler.ashx. Ce fichier, qu’on trouve dans le site de démonstration du AJAX Control Toolkit, contient le code suivant :

<%@ WebHandler Language="C#" Class="CombineScriptsHandler" %>

using System;
using System.Web;
using AjaxControlToolkit;

public class CombineScriptsHandler : IHttpHandler
{
    /// <summary>
    /// ProcessRequest implementation outputs the combined script file
    /// </summary>
    /// <param name="context"></param>
    public void ProcessRequest(HttpContext context)
    {
        if (!ToolkitScriptManager.OutputCombinedScriptFile(context))
        {
            throw new InvalidOperationException("Combined script file output failed unexpectedly.");
        }
    }

    /// <summary>
    /// IsReusable implementation returns true since this class is stateless
    /// </summary>
    public bool IsReusable
    {
        get { return true; }
    }
}

Grâce à cette démarche, les fichiers JavaScript de la librairie ASP.NET AJAX seront combinés en un seul fichier qui pourra être mis en cache et partagé par l’ensemble des pages où on utilise le contrôle ToolkitScriptManager.

Ainsi, aux bénéfices de la mise en cache de nos pages s’ajoute la réduction du temps de téléchargement des scripts clients, désormais combinés en un seul script composite.