[ASP.NET] Random usericon

Pagina: 1
Acties:

  • Marten
  • Registratie: Juli 2001
  • Laatst online: 15-08-2025
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:
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:
Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1 Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1 Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1 Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1
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 ]


  • bRight
  • Registratie: Juli 2000
  • Laatst online: 27-11-2024

bRight

digitaal

Aangezien je redirect naar de location van het plaatje kan het in ieder geval geen cahcingprobleem in de browser zijn. :)

Het ligt dus of aan je randomseed, maar das inderdaad erg onwaarschijnlijk, of aan de caching van je script.

Helaas heb ik weinig kaas gegeten van ASP.NET dus kan je niet verder helpen..

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 wil eens een gokje doen...

C#:
1
2
3
4
    string img = "http://images.illuware.com/avatars/";
           img += Request.QueryString.GetValues("s")[0] + "/";
           img += Path.GetFileName(myImages[myRandom.Next(myImages.Length)]);
           img += "&t=" & new Random().Next() * 10000;

enfin, je krijgt het idee.. :P

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Marten
  • Registratie: Juli 2001
  • Laatst online: 15-08-2025
Ik ga er vanuit dat je ipv een &t= een ?t= bedoelde? En ik ga er vanuit dat je niet een & wil maar een + voor de concatenatie van de string met de new Random?

Dan zou ik bijv de volgende URI krijgen:
code:
1
http://images.illuware.com/avatars/series1/jaguar.png?t=-1711390896


• Ik denk niet dat het plaatje dan nog gecached wordt, en dat is wel een van de vereisten.
• Gek genoeg lost dit het refresh probleem ook nog niet eens op... :?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

Ik ga er vanuit dat je ipv een &t= een ?t= bedoelde? En ik ga er vanuit dat je niet een & wil maar een + voor de concatenatie van de string met de new Random?
Jups, beiden gelijk.. :P eerste niet goed gekeken en de tweede is een automatisme omdat ik VB.Net gewend ben. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
illuware schreef op 22 december 2003 @ 16:08:
Volgens mij zeggen de specs mij nu dat wanneer ik het volgende heb:
[afbeelding]
[afbeelding]
[afbeelding]
[afbeelding]
Dat ik dan verschillende plaatjes te zien zou moeten krijgen
De browser ziet meerdere keren dezelfde url, en vraagt die maar 1 keer op. Verschillende url's worden uiteraard wel ieder apart opgevraagd.

4 keer dezelfde link:
Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1

4 keer een verschillende link (met dummy parameter):
Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1&dummy=1Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1&dummy=2Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1&dummy=3Afbeeldingslocatie: http://images.illuware.com/avatars/fmf-cached.aspx?s=series1&dummy=4

Of is dat niet wat je wil?

| Toen / Nu


  • Marten
  • Registratie: Juli 2001
  • Laatst online: 15-08-2025
Het is de bedoeling dat dit een avatar is, dus dan is het niet mogelijk om bij elke pageview een nieuwe dummy parameter mee te geven denk ik.

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

illuware schreef op 22 december 2003 @ 18:14:
Het is de bedoeling dat dit een avatar is, dus dan is het niet mogelijk om bij elke pageview een nieuwe dummy parameter mee te geven denk ik.
Een veelgebruikte truuk hierbij is met JavaScript / of wat serverside technologie een random waarde erachter te plakken.

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Ja ok, maar hij randomized toch wel, alleen niet als je meerdere op 1 pagina zet. Logisch dat de browser daar hetzelfde plaatje voor pakt. En ook niet te omzeilen.

| Toen / Nu


  • Marten
  • Registratie: Juli 2001
  • Laatst online: 15-08-2025
Spider.007 schreef op 22 december 2003 @ 18:22:
[...]


Een veelgebruikte truuk hierbij is met JavaScript / of wat serverside technologie een random waarde erachter te plakken.
Het forum beheer ik niet zelf, dus dat is geen optie.
SuperRembo schreef op 22 december 2003 @ 18:26:
Ja ok, maar hij randomized toch wel, alleen niet als je meerdere op 1 pagina zet. Logisch dat de browser daar hetzelfde plaatje voor pakt. En ook niet te omzeilen.
Probleem is dus alleen dat wanneer ik naar een andere pagina navigeer, dat ik dan de oude afbeelding opnieuw krijg, en niet random een nieuwe. Zoals gezegt doen alleen Firebird & Safari dit, IE en Opera niet. Dat hij op 1 pagina dezelfde plaatjes weergeeft heb ik geen probleem mee, al vind ik niet dat dat zo hoort, gezien de specificaties van de headers (zie hier en hier)

[ Voor 49% gewijzigd door Marten op 22-12-2003 18:50 ]

Pagina: 1