Eu tenho esses cabeçalhos sendo enviados para o cliente pelo servidor:
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT
Eu quero que o cliente valide que o arquivo não foi alterado no servidor e envie um "200" se tiver um "304".
O Firefox envia:
if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"
Por que o chrome não envia o mesmo em uma atualização da página? Eu estou atrás do comportamento que o .Net está executando:
context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
Na minha experiência, você precisa de mais do que apenas o cabeçalho de controle de cache "Privado". Você precisa do "Max-Age" ou "Expires" para forçar o Chrome a revalidar o conteúdo com o servidor.
Lembre-se de que a revalidação só será iniciada depois que esses valores de tempo tiverem passado, portanto, talvez precisem ser configurados para um valor pequeno.
Depois de passar meio dia nisso ontem, eu localizei o que estava causando o problema para mim. Contanto que você tenha o inspetor de objetos do Chrome/Depurador de Cliente/Monitor de Rede/Coisa que aparece quando você apertar F12, o Chrome não enviará cabeçalhos de solicitação de cache. Período. (atualização: nas versões mais recentes do Chrome, há uma caixa de seleção "Desativar cache"). Mesmo se você não tiver a guia "rede" aberta (ex: ter o console do javascript aberto), esta caixa de seleção ainda desabilita todo o cache.
É triste, porque depurar isso do lado do cliente obriga você a deixar o painel de rede aberto para ver quais cabeçalhos estão sendo enviados e recebidos, e quais códigos estão sendo retornados. Sem o painel de rede aberto, não há como saber se o conteúdo está sendo armazenado em cache no lado do cliente.
Se você acessar os registros de acesso do servidor, perceberá que o servidor retornará 304s (Conteúdo em cache) no minuto em que você fechar a janela de depuração em seu cliente do Google Chrome. Espero que isto ajude.
Chrome 24.0.1312.57
Eu encontrei uma resposta para esse comportamento ao usar HTTPS, pensei em compartilhar o que encontrei. Você não especifica se está solicitando via HTTP ou HTTPS.
"A regra é bem simples: qualquer erro com o certificado significa que a página não será armazenada em cache."
https://code.google.com/p/chromium/issues/detail?id=110649
Se você estiver usando um certificado autoassinado, mesmo se você informar ao Chrome para adicionar uma exceção para que a página seja carregada, nenhum recurso dessa página será armazenado em cache, e as solicitações subseqüentes não terão um cabeçalho If-Modified-Since.
Além disso ( https://stackoverflow.com/a/14899869/362780 ):
F12> Configurações> Geral> Desativar cache (enquanto o DevTools estiver aberto) -> desmarque esta opção ...
Os navegadores têm muito comportamento contra-intuitivo quando se trata de armazenamento em cache. Você esperaria que, se a resposta incluísse uma data da última modificação, o navegador revalidaria isso antes de reutilizá-la. Mas nenhum dos principais navegadores realmente faz isso.
As configurações ideais para sua situação dependem de quando você quer que o navegador revalide, veja o link abaixo.
Os navegadores não apenas agem de forma contrária, mas navegadores diferentes também se comportam de maneira diferente na mesma situação. Por exemplo, quando o usuário clica no botão Atualizar.
Você pode ler como os diferentes navegadores (Internet Explorer, Edge, Safari, FireFox, Chrome) se comportam com diretivas de cache diferentes (Etag, última modificação, deve-revalidar, expira, max-age, sem cache, sem-loja) em https://gertjans.home.xs4all.nl/javascript/cache-control.html
Eu sei que esta pergunta é antiga, mas ainda assim ... Notei que o chrome lembra a última atualização que você fez. Então, se você pressionar ctrl + shift + r (atualizando e excluindo o cache) e pressionando ctrl + r (apenas atualizando), o chrome continuará excluindo o cache e não mostrará o 304 na resposta recebida. Existe uma solução para isso. Pressione ctrl + shift + r e, em seguida, vá para a barra de endereços, concentre-a e pressione enter. Se seus etags estiverem configurados corretamente e seu servidor estiver pronto para atender um 304, você verá um novo código de resposta no depurador - 304. então funciona.