2009-03-24 6 views
7

Est-ce que l'un des navigateurs actuellement populaires rencontre des problèmes particuliers en ce qui concerne la mise en cache des réponses * XMLHttpRequest dont j'ai besoin de connaître? J'aimerais pouvoir inclure des requêtes XMLHttpRequest sur chaque page comme méthode de chargement dynamique de contenu (ie JSON) ou de comportement (comme eval() ed Javascript) en rapport avec le type de page, mais je voulais faire Assurez-vous que les ressources qu'il reçoit du serveur peuvent être mises en cache si le serveur a envoyé les bons en-têtes. Je m'inquiétais de lire this article which mentions que les navigateurs tels que Firefox 1.1 ne mettent pas en cache de contenu obtenu via XMLHTTPRequest, et qu'il demande toujours de nouvelles données sont envoyées complètement (avec Cache-Control et non If-Modified-Since) indépendamment de en-têtes envoyés par le serveur.Quels navigateurs ont des problèmes de mise en cache des réponses XMLHTTPRequest?

De toute évidence, cet article est très vieux - je ne me souviens même pas d'un Firefox 1.1; Alors, quelles sont les considérations que je dois faire pour les navigateurs actuels populaires et y at-il un truc pour quand spécifiquement veulent réponses à mettre en cache? Pour clarifier ma question, par cache, je veux dire la mise en cache côté client, où le serveur émet des informations de fraîcheur (sous la forme d'une directive Cache-Control: max-age ou d'un en-tête Expires:) et du navigateur stocke une copie de la réponse dans son cache avec une date d'expiration, de sorte que les demandes futures pour la même ressource provenant des pages suivantes puissent être satisfaites à partir du cache du navigateur sans avoir besoin du moindre contact avec le serveur. Tous les principaux navigateurs font cela correctement pour la plupart du contenu, mais j'ai entendu dire que Firefox ne peut pas le faire pour le contenu XMLHttpRequest. Ce que je demande est si quelqu'un sait des cas où l'un des navigateurs modernes ne cache pas les réponses selon la spécification en utilisant XMLHttpRequest. *

+0

c'est mieux, et plus cohérent pour le contrôler dans votre JS. Si vous n'avez pas besoin d'actualiser, ne pas interroger. – Javier

+0

Comment voulez-vous dire? Pouvez-vous donner un exemple? J'aimerais pouvoir aller chercher quelque chose sur le serveur, mais si le navigateur l'a dans son cache d'une page précédente et qu'il n'a pas expiré, cela l'empêchera de provoquer un trip serveur. Je veux toujours les données, je ne peux pas ne pas interroger. – thomasrutter

Répondre

11

Mark Nottingham a an excellent set of functional tests qui démontrent le comportement de mise en cache du navigateur XMLHttpRequest. Chargez la page dans les navigateurs que vous souhaitez prendre en charge et élaborez les techniques sur lesquelles vous pouvez et ne pouvez pas compter pour mettre votre réponse en cache.

+0

Merci beaucoup pour cela. Cela semble prometteur, car Firefox a réussi ces tests de «fraîcheur» (y compris ceux avec «Expire»). – thomasrutter

+3

le script ne semble plus fonctionner. testé dans Chrome. lots sur les avertissements de sécurité dans la console –

4

Bien que certains navigateurs aient des valeurs par défaut différentes (par défaut, IE mettra en cache les résultats d'AJAX demandes, mais Firefox, par défaut, ne sera pas), tous les navigateurs que je connais obéiront aux en-têtes http, tels que Cache-Control. Il suffit donc de définir correctement les en-têtes de mise en cache pour votre application.

Voici un exemple:

public ActionResult SomeAction() 
    { 
     var model = [...]; 
     Response.AddHeader("Cache-Control", "no-cache"); 
     return Json(model); 
    } 

Maintenant IE et Firefox seront tous les deux le même comportement; ils ne mettront jamais en cache les résultats de l'action.

+0

je ne serais pas si sûr. Le cache d'IE6 est trop agressif. J'ai été mordu plusieurs fois par ça. Si vous ne voulez pas que les requêtes soient mises en cache, ajoutez un suffixe arandom à l'URL (un paramètre inutilisé est correct) – Javier

+0

Malheureusement, c'est le contraire de ce dont j'ai besoin - je voudrais m'assurer que la réponse est en cache. C'est-à-dire, si le navigateur peut satisfaire la demande avec une réponse précédente de son cache qui n'a pas expiré, je voudrais qu'il le fasse et empêche et doive faire une requête au serveur d'origine à tous. – thomasrutter

+1

Javier, cela fonctionnera, mais il délègue la politique de cache au client, qui est à mon humble avis le mauvais endroit pour cela. –

Questions connexes