Ik heb een site waarin ik wat content dynamisch serveer. Logischerwijs wil ik dan gebruikmaken van Last-Modified met If-Modified-Since in het volgende request. De theorie werkt:
Het is een beetje ingekort om de leesbaarheid ten goede te komen. Kijk nog ff niet naar de else, omdat ie daar nog helemaal niet komt.
Geen enkele browser stuurt een If-Modified-Since mee in het tweede request, dus er zal toch iets mis gaan. Die IfModifiedSince werkt prima, want ik kan zien dat de hele If-Modified-Since header niet in het request staat, dus het is niet zo dat ik em verkeerd interpreteer ofzo.
Ik heb ook geprobeerd de Content-Length en de Content-Disposition weg te laten, maar dat hielp niets. Ik heb Firefox maarliefst 1 request zien doen waar een 304 uit kwam, maar daar zat geen If-Modified-Since bij, dus dat zal wel iets anders gweest zijn. Zeker bang voor mijn gevloek
Ik heb ook nog gespeeld met de cacheability. Private, public, must-revalidate. Je zou zeggen dat dat een hint geeft naar de browsers, maar ze blijven koppig.
Ik heb gekeken met en zonder Fiddler, met en zonder Wireshark, via de ingebouwde dev-webserver en via een echte IIS (6.0), maar maakt allemaal geen zak uit. Opera doet het overigens het minst slecht: die vraagt het bestand een minuut lang niet op, en gehoorzaamt daarmee de Expires header, maar komt na die minuut - net als alle andere browsers - met een request alsof de cache leeg is.
Hoe los ik dit op
- Browser stuurt eerste request
- Server geeft een response met Last-Modified op gisteren
- Browser stuurt tweede request
- Server ziet een If-Modified-Since in het request en vergelijkt die met de wijzigdatum van het bestand, dat nog steeds op gisteren staat
- Server geeft response 304 Not Modified
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| context.Response.Buffer = false; DateTime? ifModifiedSince = IfModifiedSince(context); if (IsModified(ifModifiedSince, options.ModifyDate)) { context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(1)); context.Response.Cache.SetLastModified((DateTime) modifyDate); //Van het bestand context.Response.ContentType = "text/css"; //Een stylesheet ja context.Response.AddHeader("Content-Disposition", "inline; filename=default.css"); context.Response.AddHeader("Content-Length", data.Length.ToString()); context.Response.Write(data); //De inhoud van het bestand } else { context.Response.ContentType = ""; context.Response.Status = "304 Not Modified"; } |
Het is een beetje ingekort om de leesbaarheid ten goede te komen. Kijk nog ff niet naar de else, omdat ie daar nog helemaal niet komt.
Geen enkele browser stuurt een If-Modified-Since mee in het tweede request, dus er zal toch iets mis gaan. Die IfModifiedSince werkt prima, want ik kan zien dat de hele If-Modified-Since header niet in het request staat, dus het is niet zo dat ik em verkeerd interpreteer ofzo.
Ik heb ook geprobeerd de Content-Length en de Content-Disposition weg te laten, maar dat hielp niets. Ik heb Firefox maarliefst 1 request zien doen waar een 304 uit kwam, maar daar zat geen If-Modified-Since bij, dus dat zal wel iets anders gweest zijn. Zeker bang voor mijn gevloek
Ik heb ook nog gespeeld met de cacheability. Private, public, must-revalidate. Je zou zeggen dat dat een hint geeft naar de browsers, maar ze blijven koppig.
Ik heb gekeken met en zonder Fiddler, met en zonder Wireshark, via de ingebouwde dev-webserver en via een echte IIS (6.0), maar maakt allemaal geen zak uit. Opera doet het overigens het minst slecht: die vraagt het bestand een minuut lang niet op, en gehoorzaamt daarmee de Expires header, maar komt na die minuut - net als alle andere browsers - met een request alsof de cache leeg is.
Hoe los ik dit op
日本!🎌