Article complet: [ASP.NET] Connaitre la taille de sa page

03/04/2009

Permalink 20:02:00, Catégories: C#, ASP.Net, Récapitulatif .NET, Récapitulatif Web, Récapitulatif, 330 mots   French (FR) , nico-pyright(c)

[.NET][Web] [ASP.NET] Connaitre la taille de sa page

Je vous présente ici une méthode qui peut permettre de connaitre la taille finale de sa page, à des buts de profiling par exemple ou simplement de log.

[Suite:]

Pour ce faire, on peut intercepter l'événement de l'application PostReleaseRequestState qui se produit lorsque ASP.NET a terminé l'exécution de tous les gestionnaires d'événements de requête et lorsque les données d'état de requête ont été stockées.

Pour s'abonner à cet événement, on peut passer par un HttpModule, mais on peut aussi utiliser le Global.Asax .

La solution proposée va être d'utiliser l'objet Response.Filter qui va permettre d'intercepter le code html généré avant la transmission au navigateur.

On l'utilise en créant une classe dérivée de Stream, en général pour le modifier. Dans notre cas, on ne va rien modifier, juste "compter".

public class Global : HttpApplication
{
   
protected void Application_PostReleaseRequestState(object sender, EventArgs e)
    {
       
if (HttpContext.Current.Handler is Page)
        {
            Response.Filter =
new LengthFilterStream(Response.Filter);
        }
    }
}

Dans cet exemple, je filtre en testant le type du Handler, mais on peut aussi filtrer avec le contenu mime.

Par exemple

if (HttpContext.Current.Response.ContentType == "text/plain")

lors d'une requete Ajax.

Le code de la classe hériant de Stream pourrait être le suivant :

internal class LengthFilterStream : MemoryStream
{
   
private int taille;
   
private readonly Stream outputStream;

   
public LengthFilterStream(Stream output)
    {
        outputStream = output;
    }

   
public override void Write(byte[] buffer, int offset, int count)
    {
        taille += count;
        outputStream.Write(buffer, offset, count);
    }

   
protected override void Dispose(bool disposing)
    {
       
Logger.Log(string.Format("Taille de la page {0} : {1}", HttpContext.Current.Request.Url, taille));
       
base.Dispose(disposing);
       
if (disposing)
            outputStream.Dispose();
    }
}

On hérite plutôt de MemoryStream, comme ca, on a déjà toute la logique implémentée.

Comme la page est envoyée en plusieurs bouts, chaque appel à Write n'est pas forcément unique, c'est pour ca qu'on logue lorsque l'objet est disposé.

Télécharger le projet démo

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0

Cet article n'a pas de Commentaires/Pingbacks pour le moment...

Vous devez être identifié pour poster un commentaire.

Liste des blogs

Blog de Nico-pyright(c)

Catégories


Rechercher

<  Janvier 2012  >
Lun Mar Mer Jeu Ven Sam Dim
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web