Pergunta

Qual é a melhor maneira de lidar com um usuário voltando para uma página que tinha itens armazenados em cache em um aplicativo asp.net?Existe uma boa maneira de capturar o botão Voltar (evento?) E manipular o cache dessa forma?

Foi útil?

Solução

Você pode tentar usar o Propriedade HttpResponse.Cache se isso ajudaria:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

Ou poderia bloquear completamente o cache da página com HttpResponse.CacheControl, mas foi descontinuado em favor da propriedade Cache acima:

Response.CacheControl = "No-Cache";

Editar:OU você poderia realmente enlouquecer e faça tudo manualmente:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

Outras dicas

Pelo que eu sei (ou pelo menos li), é melhor tentar não trabalhar em resposta aos eventos do usuário, mas sim pensar "na página".

Arquitete seu aplicativo para que ele não se importe se o botão Voltar for pressionado.Ele apenas vai lidar com isso..Isso pode significar um pouco mais de trabalho do ponto de vista do desenvolvimento, mas no geral tornará o aplicativo muito mais robusto.

Ou seja, se a etapa 3 realizar algumas alterações de dados, o usuário clicará novamente (para a etapa 2) e clicará em Avançar novamente, e o aplicativo verificará se as alterações foram feitas.Ou, idealmente, não faz qualquer duro muda até que o usuário clique em "OK" no final.Dessa forma, todas as alterações são armazenadas e você pode preencher novamente o formulário com base nos valores inseridos anteriormente no carregamento, sempre.

Espero que faça sentido :)

RFC 2616 §13.13 diz que História e Cache são coisas diferentes.Não deve haver absolutamente nenhuma maneira de o cache afetar o botão Voltar.

Se qualquer combinação de cabeçalhos HTTP afetar o botão Voltar, é um bug no navegador…com uma exceção.

Em HTTPS navegadores interpretam Cache-control: must-revalidate como solicitação para atualizar páginas quando o botão Voltar é usado (a Mozilla chama isso de "modo banco bobo").Isso não é compatível com HTTP simples.

A melhor maneira de lidar com isso é provavelmente colocar uma diretiva sem cache em suas páginas ASP.NET (ou uma página mestra, se você estiver usando uma).Não creio que haja uma maneira de lidar com isso diretamente no seu código ASP.NET (já que a decisão do cache está acontecendo no cliente).

Quanto ao MVC, não sei como você conseguiria isso (supondo que seja diferente do ASP.NET baseado em Web Forms);Eu não usei isso.

O código a seguir funcionou para mim no IE9+, FF21 e no Chrome mais recente:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

Você pode colocar isso em Page_Load() manipulador de eventos na MasterPage para que cada página do seu aplicativo exija uma viagem de ida e volta ao servidor ao pressionar o botão Voltar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top