2010-05-22 8 views
3

J'ai un script qui, en utilisant plusieurs variables de chaîne de requête fournit une image. J'utilise également la réécriture d'URL dans IIS 7.5.Images de cache fournies par le script

Donc, les images ont une URL comme ceci: http://mydomain/pictures/ajfhajkfhal/44/thumb.jpg ou http://mydomain/pictures/ajfhajkfhal/44.jpg

C'est réécrite à: http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44&thumb=thumb.jpg ou http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44

I a ajouté des règles de mise en cache pour IIS pour mettre en cache des images JPG quand ils sont demandé. Cela fonctionne avec mes images qui sont des images réelles sur le disque. Lorsque les images sont fournies via le script, elles sont toujours demandées via le script, sans être mises en cache.

Les images ne changent pas si souvent, donc si le cache est au moins conservé pendant 30 minutes (ou jusqu'au changement de fichier), ce serait mieux. J'utilise .NET/C# 4.0 pour mon site Web. J'ai essayé de définir plusieurs options de cache en C#, mais je n'arrive pas à trouver comment mettre en cache ces images (côté client), alors que mes images statiques sont mises en cache correctement. J'utilise les options suivantes pour mettre en cache l'image côté client, où 'nom_fichier' est le nom de fichier physique de l'image (sur le disque).

context.Response.AddFileDependency(fileName); 
context.Response.Cache.SetETagFromFileDependencies(); 
context.Response.Cache.SetLastModifiedFromFileDependencies(); 
context.Response.Cache.SetCacheability(HttpCacheability.Public); 
context.Response.Cache.SetExpires(DateTime.Now.AddTicks(600)); 
context.Response.Cache.SetMaxAge(new TimeSpan(0, 5, 0)); 
context.Response.Cache.SetSlidingExpiration(true); 
context.Response.Cache.SetValidUntilExpires(true); 
context.Response.ContentType = "image/jpg"; 

EDIT 2 Merci de le souligner, ce fut en effet une erreur stupide;). Je l'ai changé à 30 minutes à partir de maintenant (DateTime.Now.AddMinutes (30)).

Mais cela ne résout pas le problème. Je pense vraiment que le problème réside dans Firefox. J'utilise Firebug pour suivre chaque demande et je pense que je fais quelque chose de fondamentalement faux. Les images normales (mises en cache et statiques) donnent un code de réponse "304 (non modifié)", alors que ma page renvoie toujours "200 (OK)".

alt text http://images.depl0y.com/capture.jpg

Répondre

1

Si ce que vous entendez par « script » est le code dans votre Picture.aspx, je tiens à souligner que C# est pas un langage de script, il est donc techniquement pas un script.

Vous pouvez utiliser l'API Caching fournie par ASP.NET.
Je suppose que vous avez déjà une méthode qui contient quelque chose comme ça. Voici comment vous pouvez utiliser l'API Mise en cache:

string fileName = ... // The name of your file 
byte[] bytes = null; 

if (HttpContext.Current.Cache[fileName] != null) 
{ 
    bytes = (byte[])HttpContext.Current.Cache[fileName]; 
} 
else 
{ 
    bytes = ... // Retrieve your image's bytes 
    HttpContext.Current.Cache[fileName] = bytes; // Set the cache 
} 

// Send it to the client 
Response.BinaryWrite(bytes); 
Response.Flush(); 

Notez que les clés que vous utilisez dans le cache doit être unique à chaque élément mis en cache, de sorte qu'il pourrait ne pas suffire à utiliser simplement le nom du fichier pour cette objectif.

EDIT:

Si vous souhaitez activer la mise en cache du contenu du côté client, utilisez les touches suivantes:

Response.Cache.SetCacheability(HttpCacheability.Public); 

Vous pouvez expérimenter avec les différentes valeurs HttpCacheability. Avec cela, vous pouvez spécifier comment et où le contenu doit être mis en cache. (Par exemple.sur le serveur, sur les proxies et sur le client)

Cela fera ASP.NET pour envoyer au client les règles de mise en cache avec les en-têtes HTTP appropriés. Cela ne garantit pas que le client le mettra en cache (cela dépend des paramètres du navigateur, par exemple), mais il indiquera au navigateur "Vous devriez le mettre en cache!"

La meilleure pratique consiste à utiliser la mise en cache sur le client et le serveur.

EDIT 2:

Le problème avec votre code est le SetExpires(DateTime.Now.AddTicks(600)). 600 ticks est seulement une fraction de seconde ... (1 seconde = 10000000 ticks)
Fondamentalement, le contenu est mis en cache, mais expire le moment où il arrive au navigateur.

Essayez: (. Le TimeSpan.FromMinutes est aussi plus lisible que new TimeSpan(...))

context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5)); 
context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5)); 

+0

Hmm, le fichier est alors côté serveur mis en mémoire cache, je suppose, mais j'aimerais les images pour être mises en cache client côté (si activé dans le navigateur), mais maintenant il ne semble que pour mettre en cache les images statiques. –

+0

@Wim - Vous pouvez utiliser la mise en cache côté client en spécifiant des en-têtes http. Cela peut être fait avec ASP.NET facilement, j'ai édité ma réponse pour vous montrer comment. – Venemo

+0

@Venemo, c'est ce que j'ai essayé. Mais de toute façon, mon Firefox continue de recharger toutes les images, alors que je suis aux paramètres de cache par défaut. Quand je regarde environ: cache et vérifie si mes images sont en cache, elles sont là. Je pense que Firefox recharge toujours ces images, même si elles sont mises en cache. J'ai édité ma question pour montrer les options que j'utilise pour mettre en cache le côté client. Je pense que c'est en quelque sorte une chose de navigateur ou quelque chose. –

Questions connexes