2013-04-04 1 views
2

Je crée dynamiquement des fichiers javascript sur le serveur contenant des chaînes traduites. Lorsque je regarde l'inspecteur de chrome, ce fichier n'est jamais mis en cache (les autres fichiers JS réels qui se trouvent dans le dossier Scripts sont mis en cache) * Pourquoi n'est-ce pas? *Le fichier JS en chrome n'est jamais mis en cache

<script src="somepath/Scripts/translate-nl-BE.js"></script> 
or 
<script src="somepath/Scripts/translate-en-GB.js"></script> 

ceci est mis en correspondance avec l'action MVC suivante:

[HttpGet]   
public ActionResult TranslateJS(string culturecode) { 
    ViewBag.JSCulture = culturecode; 
    Response.ContentType = "text/javascript"; 
    return PartialView("TranslateJS"); 
} 

est ici le point de vue:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %> 
<% 
    string culturecode = ViewBag.JSCulture; 
%> 
var translations = <%=new System.Web.Script.Serialization.JavaScriptSerializer().Serialize((ViewBag.Translate as List<ERPManager.TranslationService.FlatTranslation>).Where(x=>x.CultureCode==culturecode).ToDictionary(t=>t.Key,f=>f.Value)) %>; 

ce essentiellement sérialise juste un tableau de JSON (Je sais que cela semble dirtyer que juste renvoyer un jsonresult mais je ne peux pas ajax appelez ce fichier, il faut être lié dans une étiquette de script

C'est la réponse que je reçois du serveur:

Cache-Control:private 
Content-Length:10987 
Content-Type:text/javascript; charset=utf-8 
Date:Thu, 04 Apr 2013 10:15:11 GMT 
Server:Microsoft-IIS/7.5 
X-AspNet-Version:4.0.30319 
X-AspNetMvc-Version:3.0 
X-Powered-By:ASP.NET 

est ici un aperçu du fichier get retourné: il est fondamentalement juste un dictionnaire de valeur clé des traductions.

var translations = {"vertaald":"Vertaald","gerelateerd":"Gerelateerd","details":"Details"}; 
+1

combien de temps voulez-vous mettre en cache pour? Cela va-t-il changer souvent? – Liam

+0

En ce qui concerne le navigateur, ce fichier ne changera jamais, donc devrait être mis en cache pour toujours, mais je pourrais me contenter d'une exipration quotidienne/hebdomadaire –

Répondre

2

Cela ressemble à ce que vous voulez est un expiresHTTP header

Vous pouvez le configurer dans votre code MVC:

[HttpGet]   
public ActionResult TranslateJS(string culturecode) { 
    ViewBag.JSCulture = culturecode; 
    Response.ContentType = "text/javascript"; 
    Response.Expires = (60*24);//24 hours 
    return PartialView("TranslateJS"); 
} 

Gardez à l'esprit si vous définissez un en-tête Expires le navigateur ne demandera pas à nouveau le fichier jusqu'à ce que le contenu mis en cache ait "expiré". Utiliser avec précaution!

+0

Cela a effectivement fait fonctionner! Merci! –

Questions connexes