IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

ne pas stocker en cache si utilisateur connecté


Sujet :

ASP.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut ne pas stocker en cache si utilisateur connecté
    Bonjour,

    J'ai un problème pour contrôler le cache de mes pages. Toutes les pages de mon site sont mises en cache, le problème est que mon site offre la possibilité de se connecter, et si l'utilisateur est connecté, je dois afficher une version différente de la page.
    J'ai effectué quelque recherche, et trouvé "varybycustom" pour contrôler le cache, mais je ne suis pas sûr que ça colle à ce que je souhaite faire, en effet, idéalement, j'aimerais que la page ne soit pas stockées en cache pour un utilisateur connecté (1% des consultations), et soient bien mise en cache pour les visiteurs déconnecté (99% des consultations). Il y a plus de 7000 pages mises en cache sur mon site, si j'ai 100 utilisateurs qui se connectent pour lesquels j'ai 100 versions différentes du caches, ça fait 700 000 versions de la page dans le cache, de quoi saturer la mémoire en moins de 2.

    Je ne sais même pas si ce que je cherche à faire est réalisable ! Merci de votre aide !

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 279
    Points
    279
    Par défaut
    Tu peux effectivement définir un cache custom et l'option que tu propose (varybycustom) te permet de définir tes propres règles.

    Tu devrais pouvoir t'inspirer de ça, c'est presque ce que tu veux :
    http://stackoverflow.com/questions/2...in-asp-net-mvc

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Merci pour ta réponse !
    C'est effectivement ce qu'il me fallait, malheureusment, ça ne passe pas sur mon config
    Il faut le framework 4.0, or je suis sûr windows 2000 server ().
    Je crois que je ne vais pas avoir de choix, je vais utiliser une technique pas terrible mais qui me parait être la seule solution, c'est à dire convertir le contenu de la page en contrôle utilisateur que je peux mettre en cache afin de sortir du cache les éléments de la page que je ne veux pas mettre en cache lorsque l'utilisateur est loggé. J'espère que je ne vais pas trop perdre en perfs, mais pour le moment je ne vois pas d'autres solutions.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 279
    Points
    279
    Par défaut
    Quel framework utilises-tu?
    Le 2 je suppose?

    Normalement, le varybycustom est aussi utilisable sur le framework 2.

    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
    http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

    Il faudra juste adapter un peu le code.

    Tu as une explication de l'utilisation ici :
    http://www.eggheadcafe.com/articles/20060407.asp

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Merci pour ta réponse !
    J'ai essayé en suivant tes liens et en faisant des centaines de recherches, mais je rencontre problème sur problème...Mon premier problème étant que la méthode "GetVaryByCustomString" n'est jamais appelée ! J'ai essayé de mettre des codes de débuggage dedans (écriture dans un fichier, etc), rien à faire, elle ne se déclenche jamais. Mon 2e problème est que je lis partout que les variables de Session ne sont de toutes manières pas accessibles à ce stade de l'éxecution de la page, donc impossible pour moi de savoir si l'utilisateur est connecté puisque je me base sur des variables de Session. Je vais me simplifier la vie et convertir ma page en contrôle, je ne vois plus d'autres solutions

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 197
    Points : 279
    Points
    279
    Par défaut
    Désolé, je réponds un peu tard.

    Ou est-ce que tu as mis la méthode, dans le global.asax ou dans une class?
    Si c'est une classe custom, tu dois la registrer dans le web.config.

    Je vais te donner un petit exemple.

    dans ton global.asax (ou ta class) tu peux rajouter ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public override string GetVaryByCustomString(System.Web.HttpContext context, string custom) {
                if(custom.Equals("authsetnocache")) {
                    if (User.Identity.IsAuthenticated) {
                        Response.Cache.SetExpires(DateTime.Now.AddSeconds(0));
                        Response.Cache.SetCacheability(HttpCacheability.NoCache);
                        Response.Cache.SetSlidingExpiration(true);
                    }
                }
                return "";
            }
    Et dans l'UC/layout que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ OutputCache VaryByCustom="authsetnocache" VaryByParam="none" Duration="10" %>
    En gros, par défaut, je rajoute un cache de 10 secondes sur un layout et je lui donne comme varybycustom le mot clé authsetnocache.
    Dans ma méthode, je regarde si ce paramètre custom est envoyé dans la déclaration du cache et si c'est le cas, je vérifie si la personne est loggée et dans ce cas je supprime le cache.

    C'est un petit exemple tout simple qu'il faudra adapter au besoin mais ça te donnera une idée de comment faire.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Merci pour ta réponse !
    J'avais bien mis la procédure dans le Global.asax, mais impossible de la déclencher.
    Initialement, je pensais faire un truc à peu près comme ce que tu m'as envoyé, c'est à dire ne pas mettre en cache pour un user loggé, mais vu que je n'arrive pas à déclencher la procédure, ça coince forcement.
    Cela dit, j'ai trouvé une solution encore plus adaptée à mon problème que de ne pas stocker en cache la page pour un utilisateur loggé, c'est de stocker en cache non pas la page mais un objet. En gros, j'ai converti tout ce qui est affiché dans la page en classe, j'instancie mon objet, et je le stocke en cache. Ca me permet d'agir comme je le veux sur les autres parties dans la page que je veux rendre différentes selon que l'utilisateur est loggé ou non. Je poste la technique si, si quelqu'un se pose le même problème ça pourra l'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    If Cache(request.RawUrl) Is Nothing Then
                myObjet = New Objet()
                Cache.Insert(request.RawUrl, myObjet , Nothing, DateTime.Now.AddMinutes(60), TimeSpan.Zero)
            Else
                myObjet = DirectCast(Cache(request.RawUrl), Objet)
            End If
    Ici j'ai utilisé request.RawUrl comme identifiant unique pour le cache, ça peut être n'importe quoi, mais puisque mes URLs sont uniques, pour moi c'était parfait.

    Merci encore pour ton aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Stocker la liste des utilisateurs connectés
    Par matthew016 dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 03/08/2006, 11h32
  2. [C#] Nb d'utilisateurs connectés
    Par Pasiphae dans le forum ASP.NET
    Réponses: 7
    Dernier message: 10/11/2004, 14h58
  3. Nbrs d'utilisateurs connectés ?
    Par ada_b dans le forum Administration
    Réponses: 2
    Dernier message: 25/10/2004, 10h06
  4. Récupérer utilisateurs connectés
    Par alex4 dans le forum XMLRAD
    Réponses: 2
    Dernier message: 14/04/2004, 15h21
  5. nombre d'utilisateur connecté a ma base ACCESS
    Par shkinmi dans le forum VBA Access
    Réponses: 2
    Dernier message: 28/11/2003, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo