Tengo una aplicación ASP.NET MVC 3. Esta aplicación solicita registros a través de jQuery. jQuery vuelve a llamar a una acción del controlador que devuelve resultados en formato JSON. No he podido probar esto, pero me preocupa que mis datos puedan estar almacenados en caché.
Solo quiero que el almacenamiento en caché se aplique a acciones específicas, no a todas las acciones.
¿Hay algún atributo que pueda poner en acción para garantizar que los datos no se almacenen en caché? Si no, ¿cómo me aseguro de que el navegador obtenga un nuevo conjunto de registros cada vez, en lugar de un conjunto en caché?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
Desarrollador JavaScript
fuente
fuente
Respuestas:
Para asegurarse de que JQuery no esté almacenando en caché los resultados, en sus métodos ajax, coloque lo siguiente:
O para evitar el almacenamiento en caché en MVC, creamos nuestro propio atributo, usted podría hacer lo mismo. Aquí está nuestro código:
Luego simplemente decora tu controlador con
[NoCache]
. O para hacerlo por todos, simplemente puede poner el atributo en la clase de la clase base de la que hereda sus controladores (si tiene uno) como tenemos aquí:También puede decorar algunas de las acciones con este atributo si necesita que no se puedan almacenar en caché, en lugar de decorar todo el controlador.
Si su clase o acción no tenía
NoCache
cuando se procesó en su navegador y desea verificar que funciona, recuerde que después de compilar los cambios, debe hacer una "actualización completa" (Ctrl + F5) en su navegador. Hasta que lo haga, su navegador mantendrá la versión en caché anterior y no la actualizará con una "actualización normal" (F5).fuente
Puede usar el atributo de caché integrado para evitar el almacenamiento en caché.
Para .net Framework:
[OutputCache(NoStore = true, Duration = 0)]
Para .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Tenga en cuenta que es imposible forzar al navegador a deshabilitar el almacenamiento en caché. Lo mejor que puede hacer es proporcionar sugerencias que la mayoría de los navegadores cumplirán, generalmente en forma de encabezados o metaetiquetas. Este atributo decorador deshabilitar el caché del servidor y también añadir esta cabecera:
Cache-Control: public, no-store, max-age=0
. No agrega metaetiquetas. Si lo desea, se pueden agregar manualmente en la vista.Además, JQuery y otros marcos de clientes intentarán engañar al navegador para que no use su versión en caché de un recurso agregando cosas a la url, como una marca de tiempo o GUID. Esto es efectivo para hacer que el navegador solicite nuevamente el recurso, pero en realidad no evita el almacenamiento en caché.
En una nota final. Debe tener en cuenta que los recursos también se pueden almacenar en caché entre el servidor y el cliente. Los ISP, los servidores proxy y otros dispositivos de red también almacenan recursos en caché y a menudo usan reglas internas sin mirar el recurso real. No hay mucho que puedas hacer al respecto. La buena noticia es que generalmente se almacenan en caché durante períodos de tiempo más cortos, como segundos o minutos.
fuente
Cache-Control:public, no-store, max-age=0
. No agrega metaetiquetas. Si lo desea, se pueden agregar manualmente en la vista.NoStore = true
yDuration = 0
(que he usado con éxito, gracias), pero ¿qué efecto adicional tendríaVaryByParam = "None"
ya que las otras dos opciones afectan todas las solicitudes independientemente del parámetro?Todo lo que necesitas es:
o, si desea deshabilitarlo para un controlador completo:
A pesar del debate en los comentarios aquí, esto es suficiente para deshabilitar el almacenamiento en caché del navegador; esto hace que ASP.Net emita encabezados de respuesta que le indican al navegador que el documento caduca de inmediato:
fuente
Cache-Control
apublic
max-age=0
nunca ha significado 'caché deshabilitado'. Esto solo significa que el contenido de la respuesta debe considerarse inmediatamente obsoleto , pero se permite un caché para almacenarlo en caché. Los navegadores deben validar la actualización del contenido obsoleto en caché antes de usarlo, pero no es obligatorio a menos quemust-revalidate
se especifique la directiva adicional .En la acción del controlador, agregue al encabezado las siguientes líneas
fuente
Aquí está el
NoCache
atributo propuesto por mattytommo, simplificado usando la información de la respuesta de Chris Moschini:fuente
max-age=0
nunca ha significado 'caché deshabilitado'. Esto solo significa que el contenido de la respuesta debe considerarse inmediatamente obsoleto , pero se permite un caché para almacenarlo en caché. Los navegadores deben validar la actualización del contenido obsoleto en caché antes de usarlo, pero no es obligatorio a menos quemust-revalidate
se especifique la directiva adicional .no-cache
, que todavía permite el almacenamiento en caché, pero exige revalidar en el servidor de origen antes de cualquier uso. Para evitar incluso el almacenamiento en caché revalidado, debe agregarlono-store
junto conno-cache
. (no-store
solo es claramente incorrecto porque los cachés volátiles pueden almacenar en caché el contenido marcado comono-store
.)Para MVC6 ( DNX ), no hay
System.Web.OutputCacheAttribute
Nota: cuando configura
NoStore
parámetro Duración no se considera. Es posible establecer una duración inicial para el primer registro y anular esto con atributos personalizados.Pero tenemos
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Es posible anular el filtro inicial con un atributo personalizado
Aquí hay un caso de uso
fuente
Caché de salida en MVC
fuente
El valor de atributo correcto para Asp.Net MVC Core para evitar el almacenamiento en caché del navegador (incluido Internet Explorer 11 ) es:
como se describe en la documentación de Microsoft:
Caché de respuestas en ASP.NET Core - NoStore y Location.None
fuente
Soluciones ASP.NET MVC 5:
App_Start/FilterConfig.cs
'sRegisterGlobalFilters
método:OutputCache
Directiva enController
oView
nivel. Para el controlador regular eso si es un
ApiController
seríafuente