2010-02-06 5 views
3

Nous souhaitons mettre en cache des données pour certaines listes déroulantes sur l'ordinateur client afin de réduire le transfert d'informations à évolution lente. Ces données seront utilisées sur plusieurs pages dans une application métier, par exemple une liste de clients de 5 000 clients est fréquemment utilisée pour la recherche, la création d'une commande client ou à d'autres fins. Nous avons essayé à la fois la pleine charge des données avec la page ainsi que l'accès à la base de données paginée et le chargement de la grille à la demande qui ne rapporte que 25-50 enregistrements. Les utilisateurs se plaignent des performances des deux options et le souhaitent plus rapidement. Nous recherchons donc des options sur la façon de mettre en cache les données sur le client pour les réutiliser.Données de liste déroulante du cache Asp.net sur le client

Nous avons vu quelques notes en ligne concernant la mise en cache que peut-être un fichier JS pourrait être généré par le serveur et mis en cache localement pour être la source de données pour le ddl mais jamais trouvé comment faire.

Des suggestions? Ou d'autres options que vous recommanderiez? Remarque: nous devrons également vérifier l'expiration de cette liste, car certaines listes changeront plusieurs fois par jour et devront être actualisées (pas sur une minuterie, mais quand elles changent en fonction des codes de réponse).

Répondre

2

Vous pouvez le faire via javascript, convertissez la liste en JSON et servez-la via un tag de script du cache du serveur. Je dis JSON parce que quelque chose comme jQuery ou tout autre framework javascript peut en faciliter l'utilisation.

par exemple. dans le html/ASPX:

<script src="CustomerList.aspx?Refresh=12308798798023745" type="text/javascript"></script> 

Le rafraîchissement étant les DateTime.Now.Ticks du dernière fois qu'il a changé sur le serveur. Ainsi, lorsque vous placez cette balise dans chaque page, le client la récupère une seule fois, et de nouveau lorsqu'elle change réellement sur le serveur.

Quelque chose comme ce côté serveur:

public class Cache { 
    public static List<Customer> Customers { get; set; } 
    public static DateTime LastRefresh { get; set; } 
    public static void RefreshCustomers { 
    //Populate Customers, Customers = blah; 
    LastRefresh = DateTime.Now; 
    } 
} 

Dans la page:

ScriptTagwithRunAtServer.Src = "CustomerList.aspx?Refresh=" + Cache.LastRefresh.Ticks; 

De toute façon vous rendre cette balise serait bien, juste un exemple. La page CustomerList.aspx rendrait juste le Cache.Customers dans la forme de json ... et votre page exécuterait un peu de javascript pour faire n'importe quelle utilisation de lui.

Juste une idée, s'il vous plaît commenter si cela vous intéresse et je laisse quelque chose.

+0

Ce serait mon approche si je devais aller de l'avant avec cela (et TBH, je voudrais essayer de l'éviter et de le garder côté serveur). Cependant, je considérerais également la plomberie dans une sorte de délai d'expiration pour ajouter * un * élément * de "contrôle". –

+0

@Rob - C'est l'idée de '? Refresh = ####', il indique au client de se rafraîchir quand JSON mis à jour est disponible ... ou vous voulez dire expiration du cache? –

+0

Nick - ceci est d'intérêt. Est-ce que cela est également caché du côté du client? Pourrions-nous trouver un moyen de mettre en cache la liste des clients une fois côté client et de réutiliser ce cache sur plusieurs pages (sans revenir au serveur pour la liste des clients), par exemple sur la page Commandes, la page Recherche de commande, ...? – asp2go

3

Avant d'essayer de commencer les choses de mise en cache sur le client, ce qui est une manière imprévisible de faire les choses pour la simple raison que vous avez aucun contrôle sur la façon dont leur navigateur est configuré pour le cache (s'ils ont mis en cache à "jamais"?), il y a beaucoup de choses que vous devriez regarder.

  1. Avez-vous regardé la mise en cache sur le serveur premier? Vous pouvez utiliser OutputCache et le modifier par paramètre (le numéro de page de la grille, par exemple) pour la mise en cache partielle de tous les jeux de données affichés.

  2. Qu'est-ce qui est lent au sujet de l'expérience utilisateur? Analysez-le avec firebug ou fiddler et voyez combien de requêtes sont faites au serveur par page. Simplifier simplement le nombre de requêtes HTTP envoyées (en fusionnant et en réduisant les CSS et les javascripts par exemple) fera des merveilles pour le temps de réponse.

  3. Que contient votre ViewState? Réduisez la quantité de données envoyées dans ViewState pour accélérer le chargement de la page.

  4. La routine de récupération de données sur le serveur prend-elle trop de temps? Optimisez-le, et cachez peut-être les données sur le serveur afin de ne pas avoir à aller à la base de données aussi souvent.

Peut-être que vous avez essayé déjà tout cela, mais je pensais que je jette là-bas parce que la mise en cache appuyant sur côté client peut être un excercise frustrant.

+0

Merci pour la suggestion - nous avons essayé tous ces points et pendant qu'ils aident il y a toujours un problème. (1) oui - la mise en cache sur le serveur a été effectuée dans la mesure du possible (certaines pages de recherche sont trop dynamiques pour définir les itérations de paramètres fixes). (2) Par exemple, sur un écran que vous créez une commande client, vous trouverez un en-tête de base et une grille de détails. Charger les clients en une seule fois (> 5000) est très lent, mais charger 50 clients à la demande en utilisant une pagination Sql avancée via un objet personnalisé prend 3-4 secondes en raison de connexions réseau lentes. – asp2go

+0

(3) Oui, nous avons fait cela - la taille initiale de la page est d'environ 175kb avec la plupart des contrôles viewstate off, les messages Ajax pour récupérer les clients sont 1kb - Sur un serveur haute vitesse avec des utilisateurs connectés à bande passante élevée faire défiler les listes déroulantes avec «pagination virtuelle» semble même instantané, mais malheureusement avec le scénario que nous avons, il y a une réponse de 3 à 4 secondes pour chaque requête, donc remplir uniquement l'en-tête de commande avec plusieurs listes déroulantes est frustrant pour les utilisateurs. (4) Ce n'est pas le chargement qui pose problème - Sql Profiler affiche une durée de 10-15 millisecondes. – asp2go

+0

Si nous incluons les données (juste ID et nom) pour seulement trois listes déroulantes (1000-5000 par ddl) dans la page au chargement de la page, la taille se rapproche d'un Mb et la réponse est plus de 20 secondes sur le réseau de l'utilisateur à charger. Bien sûr, après cela, la page fonctionne bien, mais nous recherchons un chargement rapide de la page et une réponse rapide. Le coût de mise à niveau réseau/bande passante dans ce scénario est également extrêmement élevé, ce qui ne permet pas de résoudre le problème. – asp2go

Questions connexes