ETAGS, IIS7, Kernel Cache Policy (EnablekernelCache)
Pergunta
Pergunta em duas partes (as peças estão intimamente relacionadas): com a política de ETAG padrão que o IIS7 emprega, por que não vemos a interação IF-Match/304 enquanto navegamos pelas páginas?
Os cabeçalhos retornaram para uma solicitação de cache vazio, por exemplo, são:
Content-Type image/png
Last-Modified Thu, 03 Dec 2009 15:51:56 GMT
Accept-Ranges bytes
Etag "a8a0628a3074ca1:0"
Server Microsoft-IIS/7.0
X-Powered-By ASP.NET
Date Tue, 22 Dec 2009 19:47:36 GMT
Content-Length 1780
... e, no entanto, acessos subsequentes à página não geram uma viagem de ida e volta para a imagem?
Além disso, o padrão ApplicationHost Arquivo para o IIS7 tem o seguinte (1):
<caching enabled="true" enableKernelCache="true">
</caching>
Faz enablekernelcache = 'true' estender a todos os arquivos estáticos, liberando a necessidade de registrar extensões explicitamente para conceder CacheuntilChange como a política do kernel (2):
<caching>
<profiles>
<add extension=".gif" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".png" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".jpg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
<add extension=".jpeg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
</profiles>
</caching>
(1) %Systemroot % System32 inetsrv config ApplicationHost.config
(2) http://labs.episerver.com/en/blogs/per/archive/2009/3/configuring-cache-expiration-on-iis-7/
Solução
O manuseio de ETAGs e o-IF-NONE-Match / If-modificado-uma vez depende de um pouco de dependente do navegador. Você pode tentar alguns navegadores diferentes e ver o que acontece - em geral, se você não definir um tempo de validade explícito, eu esperaria ver os 304, como você disse.
Para cache de kernel, ele está ativado para arquivos estáticos por padrão. Para ajudar a ver o que está acontecendo, achei útil executar o seguinte comando:
netsh http show cachestate
Isso mostrará informações sobre os arquivos que estão atualmente no cache.
Lembre -se de que os arquivos normalmente precisam ser referenciados algumas vezes dentro de uma determinada janela de tempo antes que o kernel os cache.