Ik ben wat aan het knutselen met een random user icon selector in ASP.NET. Daarbij wil ik het natuurlijk zo voor elkaar hebben dat de verwijspagina zelf niet gecached wordt en bij iedere request daarwerkelijk gerequest wordt, maar de afbeelding waar uiteindelijk naar verwezen wordt moet - omwille van mijn @Home 16kb upstream bandbreedte - wel gecached worden.
Ik heb de volgende code geprutst:
Dit wordt via fmf-cached.aspx opgeroepen, maar dat is verder niet echt van belang. In IIS heb ik voor de fmf-cached.aspx file het volgende ingesteld:
• UITGEVINKT: Enable content expiration
• Geen custom HTTP headers
Op de directory met icons heb ik ingesteld:
• UITGEVINKT: Enable content expiration
• 1 custom HTTP header: Cache Control: public
Volgens mij zeggen de specs mij nu dat wanneer ik het volgende heb:
Dat ik dan verschillende plaatjes te zien zou moeten krijgen, want aangezien het resultaat van de request niet gecached zou moeten mogen worden, zou er voor elk plaatje opnieuw een request gestuurd moeten worden, en je maakt mij niet wijs dat dit binnen 1 tick gebeurt. Dit gebeurd met geen enkele browser. Op zich niet erg, want dan heb je per pageview mooi uniformiteit. (maar wel erg slecht dat dit fout gedaan wordt door alle browsers - ookal zit het tegen de grenzen van de specs aan).
Tijdens gebruik blijkt echter nog een vreemd aspect bij het navigeren tussen verschillende topicpagina's: Firebird gefreshed helemaal niet, IE en Opera wel. Tijdens het browsen behoud Firebird dus telkens hetzelfde plaatje, totdat je zelf een refresh doet. Dit is natuurlijk een beetje funest voor het idee van een random plaatje. Voor de volledigheid hieronder nog de volledige output van een wget -S:
Wat doe ik nu fout dat waardoor Firebird niet telkens een nieuw plaatje laat zien?
Update: Safari doet het alleen als het een (a) nieuwe pagina is of (b) bij een reload.
Extra info: De HTTP Status code 302 geeft aan dat het een tijdelijke redirect is en dat de locatie waarheen geredirect wordt zou kunnen veranderen en dat dus deze url telkens opnieuw moet worden opgevraagd, m.a.w. de redirect mag niet worden gecached.
Ik heb het ook met een code 307 geprobeerd, wat net zo min werkt.
Ik heb de volgende code geprutst:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| using System.Runtime.InteropServices; using System; using System.IO; using System.Collections; public class PNGC : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { // get filelisting string[] myImages = Directory.GetFiles(Server.MapPath(Request.QueryString.GetValues("s")[0]), "*.png"); // select the random background Random myRandom = new Random(unchecked((int)DateTime.Now.Ticks)); string img = "http://images.illuware.com/avatars/"; img += Request.QueryString.GetValues("s")[0] + "/"; img += Path.GetFileName(myImages[myRandom.Next(myImages.Length)]); Response.AppendHeader("Cache-Control", "no-cache, must-revalidate"); Response.StatusCode = 302; Response.AddHeader("Location",img); } } |
Dit wordt via fmf-cached.aspx opgeroepen, maar dat is verder niet echt van belang. In IIS heb ik voor de fmf-cached.aspx file het volgende ingesteld:
• UITGEVINKT: Enable content expiration
• Geen custom HTTP headers
Op de directory met icons heb ik ingesteld:
• UITGEVINKT: Enable content expiration
• 1 custom HTTP header: Cache Control: public
Volgens mij zeggen de specs mij nu dat wanneer ik het volgende heb:
Dat ik dan verschillende plaatjes te zien zou moeten krijgen, want aangezien het resultaat van de request niet gecached zou moeten mogen worden, zou er voor elk plaatje opnieuw een request gestuurd moeten worden, en je maakt mij niet wijs dat dit binnen 1 tick gebeurt. Dit gebeurd met geen enkele browser. Op zich niet erg, want dan heb je per pageview mooi uniformiteit. (maar wel erg slecht dat dit fout gedaan wordt door alle browsers - ookal zit het tegen de grenzen van de specs aan).
Tijdens gebruik blijkt echter nog een vreemd aspect bij het navigeren tussen verschillende topicpagina's: Firebird gefreshed helemaal niet, IE en Opera wel. Tijdens het browsen behoud Firebird dus telkens hetzelfde plaatje, totdat je zelf een refresh doet. Dit is natuurlijk een beetje funest voor het idee van een random plaatje. Voor de volledigheid hieronder nog de volledige output van een wget -S:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| ~/tmp/> wget -S http://images.illuware.com/avatars/fmf-cached.aspx?s=series1 && rm -f *
--16:00:27-- http://images.illuware.com/avatars/fmf-cached.aspx?s=series1
=> `fmf-cached.aspx?s=series1'
Resolving images.illuware.com... done.
Connecting to images.illuware.com[213.51.89.102]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 302 Found
2 Connection: Keep-Alive
3 Content-Length: 0
4 Date: Mon, 22 Dec 2003 15:00:32 GMT
5 Location: http://images.illuware.com/avatars/series1/jaguar.png
6 Server: Microsoft-IIS/6.0
7 X-Powered-By: ASP.NET
8 X-AspNet-Version: 1.1.4322
9 Cache-Control: no-cache, must-revalidate
Location: http://images.illuware.com/avatars/series1/jaguar.png [following]
--16:00:27-- http://images.illuware.com/avatars/series1/jaguar.png
=> `jaguar.png'
Connecting to images.illuware.com[213.51.89.102]:80... connected.
HTTP request sent, awaiting response...
1 HTTP/1.1 200 OK
2 Connection: Keep-Alive
3 Content-Length: 10490
4 Date: Mon, 22 Dec 2003 15:00:32 GMT
5 Content-Type: image/png
6 Cache-Control: public
7 Last-Modified: Sun, 21 Dec 2003 21:04:35 GMT
8 Accept-Ranges: bytes
9 ETag: "807b9596c8c31:d67"
10 Server: Microsoft-IIS/6.0
11 X-Powered-By: ASP.NET
100%[==============================================================>] 10,490 16.90K/s ETA 00:00
16:00:28 (16.90 KB/s) - `jaguar.png' saved [10490/10490] |
Wat doe ik nu fout dat waardoor Firebird niet telkens een nieuw plaatje laat zien?
Update: Safari doet het alleen als het een (a) nieuwe pagina is of (b) bij een reload.
Extra info: De HTTP Status code 302 geeft aan dat het een tijdelijke redirect is en dat de locatie waarheen geredirect wordt zou kunnen veranderen en dat dus deze url telkens opnieuw moet worden opgevraagd, m.a.w. de redirect mag niet worden gecached.
Ik heb het ook met een code 307 geprobeerd, wat net zo min werkt.
[ Voor 8% gewijzigd door Marten op 22-12-2003 16:12 . Reden: Update & Extra info ]