Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[asp.net] If-Modified-Since icm Last-Modified

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
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:
  1. Browser stuurt eerste request
  2. Server geeft een response met Last-Modified op gisteren
  3. Browser stuurt tweede request
  4. Server ziet een If-Modified-Since in het request en vergelijkt die met de wijzigdatum van het bestand, dat nog steeds op gisteren staat
  5. Server geeft response 304 Not Modified
Zou vrij simpel te implementeren moeten zijn, maar niets is minder waar. Het is niet dat het me niet lukt, ik heb deze theorie in een mooi stukje C# geschreven en is het haast onmogelijk dat het niet werkt. Toch werkt het niet. Het ziet er ongeveer zo uit:
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 :?

日本!🎌


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Test aan de clientside eens met Firebug zou ik zeggen (Net tab). Misschien is er ook een Etag nodig, werk SetLastModified niet goed, of is er nog iets anders.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Een ETag kan ik wel maken (denk ik), maar ik wil het eerst via een datum aan de praat krijgen. ETag erbovenop is een extraatje. SetLastModified werkt overigens perfect, getuige de response headers uit firebug voor het desbetreffende bestand:
code:
1
2
3
4
5
6
7
8
9
10
Server: ASP.NET Development Server/9.0.0.0
Date: Mon, 07 Jul 2008 19:20:21 GMT
X-AspNet-Version: 2.0.50727
X-Powered-By: UrlRewriter.NET 2.0.0
Transfer-Encoding: chunked
Cache-Control: public
Expires: Mon, 07 Jul 2008 19:21:21 GMT
Last-Modified: Sun, 06 Jul 2008 20:31:19 GMT
Content-Type: text/css; charset=utf-8
Connection: Close

De Last-Modified staat zoals verwacht op gisteren, maar de request headers naar hetzelfde bestand bij een volgende pageview (die ik trigger door gewoon een link aan te klikken) zeggen me dat er toch iets niet in de haak moet zijn:
code:
1
2
3
4
5
6
7
8
9
Host: localhost:1508
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15
Accept: text/css,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost:1508/Gallery/1/Test_album

Want ik zie geen If-Modified-Since.

ja, je ziet nu ook gelijk wat ik aan het maken ben :)

日本!🎌


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

pedorus schreef op maandag 07 juli 2008 @ 20:15:
Test aan de clientside eens met Firebug zou ik zeggen (Net tab). Misschien is er ook een Etag nodig, werk SetLastModified niet goed, of is er nog iets anders.
Voor dit soort dingen te testen vind ik LiveHTTPHeaders meestal iets inzichtelijker.

Professionele website nodig?


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Topicstarter
Je kijkt er op een andere manier naar ja, maar het probleem blijft onopgelost. IE6 doet af en toe een If-Modified-Since voor dynamische content. Maar echt heel af en toe en dan ook niet voor alle files, terwijl die daarvoor wel een last-Modified hebben gekregen.

Firefox daarentegen doet nooit een If-Modified-Since meesturen.

//edit
Ik zie net dat IE7 keurig de regeltjes volgt. Geen request in de eerste minuut als de Expires nog niet voorbij is en een If-Modified-Since (resulterend in een 304) na die minuut. Dat heb ik nog geen enkele andere browser zien doen.

//edit2
Kan dit zijn omdat ik naar een lokale server connecteer? Ik kan me voorstellen dat een browser die If-Modified-Since over intranet maar onzin vindt, en pas op een "langzame" lijn als internet gaat toepassen...

[ Voor 42% gewijzigd door _Thanatos_ op 13-07-2008 00:24 ]

日本!🎌