IIS en statische inhoud?

Volgens Ultrasnelle ASP.NET: Hoofdstuk 3 – Caching:

Bestanden die de browser ophaalt van de server moeten worden opgeslagen in
de cache van de browser zo lang mogelijk om de server te helpen minimaliseren
rondreizen.

  • Maar hoe weet IIS wat een statische inhoudeigenlijk is en niet is?

    Zijn het alleen afbeeldingen, CSS, JS en nietASPX, ashx…?

    Waarkan ik in IIS zien wat al als statischwordt beschouwd en wat niet?

  • Hoe zit het met het scenario waarin een pagina is gedeclareerd met de kop <%@ OutputCache(zonder location)? Worden de images, cssen JSbronbestanden erin ookuitgevoerd in de cache met dezelfde eigenschappen?

  • Als best practice zou ik een jaar in de toekomst moeten stellen als de maximale vervaltijd. Ik zou dat als standaard moeten gebruiken voor alle statische inhoud op de site

Dus ik deed dit:

Maar later, nadat ik op OKheb gedrukt, kan ik geensamenvattend menu vinden dat me laat zien: aan wieik heb al een antwoord gegeven header (in dit geval: de cssmap).

Momenteel, om te zien dat de map cssis toegepast met antwoordheaders, moet ik naar de map cssgaan opnieuw-->Http Response Header-->Stel algemene headers in -->en dan zie ik het . Het is niet geschreven in de web.config.

Maarals ik het voor een bestand doe (bijvoorbeeld Login.aspx): ik zie het wel in web.config:

<configuration>
    <location path="Login.aspx">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>

Antwoord 1, autoriteit 100%

Ik begrijp uw situatie. Soms is het verwarrend hoe IIS met een bestand omgaat. Het is ook anders voor IIS 6 versus IIS 7 en anders voor klassieke app-pools en app-pools met geïntegreerde modus. Mijn ervaring is voornamelijk met Integrated App Pools op IIS 7.5, dus dat is de omgeving waar ik het meest nauwkeurig op kan reageren.

Eerste vraag

Maar hoe weet IIS wat eigenlijk een statische inhoud is en wat?
niet?

Zijn het alleen afbeeldingen, css, js en niet ASPX, ashx…?

Waar kan ik in de IIS zien wat al als statisch wordt beschouwd en
wat niet?

U kunt de lijst met bestandshandlers in IIS bekijken door naar uw website te gaan en vervolgens op ‘Handlertoewijzingen’ te klikken. Deze worden standaard overgenomen van de .Net-basisweb.config die zich op een andere locatie bevindt, afhankelijk van uw .Net-frameworkversie.

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config

Als een bestand dat wordt opgevraagd nog niet expliciet is toegewezen aan een andere handler, valt het onder een catch all handler (*) als laatste optie (System.Web.DefaultHttpHandler) die bepaalt of het een statisch bestand is of een zoekverzoek voor mappen. Statische bestanden zijn dus gewoon bestanden die nog niet aan een andere handler zijn gebonden. U zult bijvoorbeeld zien dat *.aspxal is toegewezen aan System.Web.UI.PageHandlerFactoryvóór deze standaardhandler. Het wordt dus door die handler verwerkt en niet als een statisch bestand beschouwd. Als je die toewijzing hebt verwijderd, zou je technisch gezien *.aspx als statisch bestand kunnen dienen als je dat echt zou willen (alleen als bewijs van hoe het werkt).

Maar je kunt een bestandstype ook expliciet als een statisch bestand vermelden door een item toe te voegen in de httpHandlers-sectie van je web.config om de bestandsextensies toe te wijzen aan System.Web.StaticFileHandlerin IIS. Bijvoorbeeld:

<configuration>
  <system.webServer>
    <handlers>
      <add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>

Dit voorbeeld gebruikt de <system.webServer>configuratiesectie, dus het is voor een app-pool die wordt uitgevoerd in de geïntegreerde modus.

Tweede vraag

Hoe zit het met het scenario waarin een pagina is gedeclareerd met <%@
OutputCache-header (zonder locatie) . doet de afbeeldingen, css, js src
bestanden erin, worden ook uitgevoerd in de cache met hetzelfde
eigenschappen?

Nee. Omdat de pagina server wordt als een afzonderlijk verzoek (misschien zelfs door een afzonderlijke handler), kan deze totaal verschillende cacheheaders/hints hebben. De hostpagina en de bronnen die het kan gebruiken zijn niet gerelateerd vanuit een cachingperspectief.

Misschien wilt u zelfs een kortere cacheperiode voor *.html en een langere cacheperiode voor *.jpg of *.png? Iets om over na te denken.

Derde vraag

Als best practice zou ik een jaar in de toekomst moeten stellen als de
maximale vervaltijd. Ik zou dat als standaard voor iedereen moeten gebruiken
statische inhoud op de site

Hmm… Ik ga misschien niet zo ver als een jaar. Wat dacht je van een maand? Ik zou een globaal beleid als volgt instellen:

<configuration>
  <system.webServer>
    <staticContent>
      <!-- Set expire headers to 30 days for static content-->
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Dit is hetzelfde als het voorbeeld dat u hierboven liet zien, maar bevindt zich niet in een <location>-element, maar bevindt zich in de hoofdmap <configuration>element, dus het is het standaardbeleid. Nogmaals, dit is voor een app-pool die wordt uitgevoerd in de geïntegreerde modus. Soms moet je ook inschakelen:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>

Dit zorgt er alleen voor dat statische bestanden worden verwerkt via de beheerde statische bestandshandler die de bovenstaande configuratie-elementen respecteert.

Bewerken in adresreacties

De documentatie voor het configuratiedialoogvenster dat u hierboven heeft geplaatst, vindt u hier: Configureer de HTTP Expires Response Header (IIS 7)

Blijkbaar zijn deze instellingen opgeslagen inC:\Windows\System32\inetsrv\config\ applicationHost.config

Ik heb geen IIS7 en ontwikkel me nu persoonlijk op IIS 7.5. Dus plaats een reactie als je kunt verifiëren dat deze locatie correct is!


Antwoord 2, autoriteit 5%

  1. De statische inhoud is de inhoud die door IIS wordt gelezen en naar de browser wordt verzonden zonder enige verwerking. Daar kun je IIS instellen om een ​​Cache-Control Headerop te nemen om het op de browsercomputers van de client te cachen.
  2. Je kunt dat ether doen door IIS direct in te stellen, ether door commando’s op web.configzoals je zegt. De commando’s die je toevoegt aan web.config en die betrekking hebben op de IIS, hadden niet te maken met asp.net zelf, maar de IIS, en IIS slaat zijn configuratie op in een ander bestand, dus als je die cache wijzigt, regelheaders direct op IIS je ziet ze niet op web.config.
  3. Nu voor de statische inhoud zoals afbeeldingen, CSS, JavaScript en andere vergelijkbare bestanden ze stel dat u het beleid “verloopt nooit” kunt volgen door 10 jaar vervaldatum toe te voegen.
  4. Het probleem hier is dat als je de inhoud van het statische bestand niet kunt wijzigen, als je bijvoorbeeld een javascript-bestand met 10 jaar cachet en je een kleine wijziging aanbrengt, je ether nodig hebt om de bestandsnaam te wijzigen , ether om aan het einde een parameter toe te voegen.
  5. Nu wordt de <%@ OutputCacheop een besturingselement verwezen naar de servercache en niet naar de client, en wat er feitelijk wordt gedaan, is de weergave van het besturingselement op de server cachen, zodat de de volgende keer dat u het vraagt ​​om geen tijd te verliezen om het opnieuw te renderen, maar het uit de cache te lezen, stuurt u het nog steeds naar de browser.

En je kunt dit antwoord ook lezen voor meer informatie: Wat is het verschil tussen IIS (dynamische en statische) cache, OutPutCache en browsercache

Other episodes