2010-02-25 4 views
0

J'ai une simple preuve de concept qui semble gérer la mise en cache bizarrement. Voici la vue:Mise au point de la mise en cache AJAX dans ASP.NET MVC

<script>  
$('#clickToLoad').click(function() { 
    $.ajax({ 
     url: "<%=ResolveUrl("~/Home/AjaxCacheTest") %>?" 
     , dataType: 'json' 
      ,ifModified: true 
      ,cache: true 
     ,success: function(sourceData) { 
     } 
    }); 
}); 
</script> 

Ceci est lié à une action dans le contrôleur:

[OutputCache(VaryByParam = "none", Duration = 3000)] 
public ContentResult AjaxCacheTest() 
{ 
    return Content("0", "application/json"); 
} 

Je voudrais obtenir un résultat avec la mise en cache, cependant, il semble que AjaxCacheTest ne cache pas à moins que Je le demande tout seul (c'est-à-dire, dans une fenêtre de navigateur, au lieu d'AJAX).

La définition du cache: true n'aide pas. Définir ifModified: true provoque la mise en cache, mais n'appelle pas la fonction de succès, donc je ne peux pas utiliser les résultats.

Existe-t-il des options qui autorisent la mise en cache et appellent toujours le rappel de réponse?

MISE À JOUR: Merci d'avoir oublié d'ajouter ces éléments. Je teste avec firebug et de déterminer comment la mise en cache est gérée par une combinaison de regarder le code de réponse (200 OK vs 302) et le temps de réponse pour la demande. Tout cela est sur le serveur intégré de Visual Studio (Cassini?).

+2

Avec quoi testez-vous? IIS? Cassini? Êtes-vous en mode débogage (je veux dire le paramètre dans web.config)? Avez-vous vérifié les en-têtes reqeust et response via un outil comme FireBug ou quelque chose de similaire? S'il vous plaît, ajoutez les réponses à la question. –

Répondre

2

Voici comment fonctionne la mise en cache dans votre scénario. Supposons que vous définissez l'action suivante

[OutputCache(VaryByParam = "none", Duration = 5)] 
public ActionResult AjaxCache() 
{ 
    return Json(new { date = DateTime.Now }, JsonRequestBehavior.AllowGet); 
} 

Si vous ne définissez pas explicitement l'Location attribuer par défaut à OutputCacheLocation.Any ce qui signifie:

Le cache de sortie peut être situé sur le client du navigateur (où le request originated), sur un serveur proxy (ou tout autre serveur ) participant à la demande , ou sur le serveur sur lequel la demande a été traitée. Cette valeur correspond à la valeur HttpCacheability.Public denumeration .

Duration = 5 signifie que le contenu sera mis en cache pendant 5 secondes. Ensuite, vous envoyez la demande ajax:

<%= Html.ActionLink("cache test", "AjaxCache") %> 

<script type="text/javascript"> 
$(function() { 
    $('a').click(function() { 
     $.ajax({ url: this.href, 
      success: function(json) { 
       $('#result').html(json.date); 
      } 
     });   
     return false; 
    }); 
}); 
</script> 

<div id="result"></div> 

Si vous cliquez sur le lien deux fois pendant 5 secondes d'intervalle, vous verrez que la div résultat ne changera ni l'action du serveur sera frappé mais le rappel success sera toujours exécuter. Le serveur envoie les en-têtes suivants:

Cache-Control: public, max-age=5 
Expires: Fri, 26 Feb 2010 14:09:02 GMT 
Last-Modified: Fri, 26 Feb 2010 14:08:57 GMT 
Vary: * 
+0

On dirait que ça marche un peu ... J'ai dû passer à MVC 2 pour l'essayer, peut-être que ça avait quelque chose à voir avec ça. Il n'envoie plus les 304, seulement les 200. Je ferai d'autres tests et je m'en rendrai compte plus tard, merci. – Chris

+0

Oui, cela fonctionne dans MVC 2, ne sais pas ce qui était cassé dans MVC 1. Juste un avertissement; au moins dans mon cas, j'ai dû ajouter dataType: 'json' à l'appel ajax. Merci! – Chris