2012-03-02 4 views
1

Je souhaite ajouter la mise en cache à certaines actions enfants afin que je puisse mettre en cache séparément les parties d'une seule page.MVC: OutputCache et RenderPartial extrêmement lent

J'ai besoin de la même méthode de contrôleur pour être accessible à la fois depuis AJAX et avec RenderAction (ou une autre méthode d'intégration). J'ai changé mon code pour utiliser RenderAction et j'ai constaté que chaque Html.RenderAction ajoute environ 1 seconde au temps de chargement de la page, lorsque la première charge est si lente - il est difficile de profiter des fruits des charges suivantes.

J'ai vu des réponses ici sur le SO, conseiller de rester loin de RenderAction ...

Alors, quelle est la meilleure stratégie pour éviter le décalage RenderAction et toujours être en mesure de cache et une seule méthode que je peux appel à la fois HTML et AJAX? (et .. comment gérer l'invalidation du cache dans ce cas?)

Répondre

1

Que fait l'ajax ici? Renvoyez-vous un JSonResult s'il est appelé à partir d'ajax et un ViewResult pour les appels normaux? Essayez d'utiliser RenderAction avec une vue rasoir.

Le moteur du rasoir est plus rapide. Lorsque le résultat est mis en cache, renderaction est extrêmement rapide (x1000).

Pour la mise en cache, utilisez-vous l'attribut [OutputCache]? Si oui, vous ne pouvez pas invalider le cache par vous-même (ou je ne sais pas à ce sujet).

Ou peut-être utilisez-vous OutputCache avec des paramètres VaryByParam qui multiplient insuffisamment les caches en mémoire.

+0

oui, parfois 'JsonResult' et parfois' View'. J'utilise le moteur Razor - le temps de mise en cache est super, mais la première charge est péniblement lente. Oui, en utilisant OutputCache avec VaryByParam (avec beaucoup de paramètres .. EDIT: 6) – Madd0g

+0

vous ne devriez pas avoir trop de paramètres, car le cache utilisera trop de mémoire. Il va recycler les premiers objets mis en cache et ralentir la page. Cache memoryUsed = viewText^paramValuesCount. Si paramsCount = 6 et paramValuesCount = 1000 mémoire utilisée = 10K^6000 = débordement) et votre cache ... recycle les éléments dès qu'ils sont mis en cache. – Softlion

+0

Pour le moment, je suis plus préoccupé par la performance de 'RenderPartial', la partie de la question de la mise en cache est plus conceptuelle, de la façon de DRY lors de l'utilisation du cache de sortie – Madd0g