Algunos navegadores almacenan en caché archivos js y css, y no los actualizan a menos que los fuerce. Cuál es la forma más fácil.
Acabo de implementar esta solución que parece funcionar.
Declare una variable de versión en su página
public string version { get; set; }
Obtenga el número de versión de la clave web.config
version = ConfigurationManager.AppSettings["versionNumber"];
En su página aspx, realice las llamadas a javascript y hojas de estilo como tal
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
Por lo tanto, si configura la versión = 1.1 desde 1.0 en su web.config, su navegador descargará los archivos más recientes que, con suerte, le ahorrarán a usted y a sus usuarios algo de frustración.
¿Existe otra solución que funcione mejor o esto causará problemas imprevistos en un sitio web?
javascript
c#
asp.net
.net
asp.net-mvc
kiev
fuente
fuente
Respuestas:
Resolví esto agregando una última marca de tiempo modificada como parámetro de consulta para los scripts.
Hice esto con un método de extensión y lo usé en mis archivos CSHTML. Nota: esta implementación almacena en caché la marca de tiempo durante 1 minuto, por lo que no destruimos tanto el disco.
Aquí está el método de extensión:
Y luego en la página CSHTML:
En el HTML renderizado, esto aparece como:
fuente
Tu solución funciona. De hecho, es bastante popular.
Incluso Stack Overflow usa un método similar:
¿Dónde
v=6184
está probablemente el número de revisión SVN?fuente
En ASP.NET Core (MVC 6), esto funciona de inmediato a través del
asp-append-version
asistente de etiquetas:fuente
ASP.NET MVC se encargará de esto por usted si usa paquetes para su JS / CSS. Agregará automáticamente un número de versión en forma de GUID a sus paquetes y solo actualizará este GUID cuando el paquete se actualice (también conocido como cualquiera de los archivos de origen tiene cambios).
Esto también ayuda si tiene una tonelada de archivos JS / CSS, ya que puede mejorar en gran medida los tiempos de carga de contenido.
Mira aquí
fuente
Hay una forma incorporada en asp.net para esto: agrupación . Solo utilícelo. Cada nueva versión tendrá un sufijo único "? V = XXXXXXX". En el modo de depuración, la agrupación está desactivada, para activar la configuración de make en web.config:
O agregue al método RegisterBundles (BundleCollection bundles):
Por ejemplo:
BundleConfig.cs:
_Layout.cshtml:
fuente
Hay una respuesta más simple a esto que la respuesta dada por el operador en la pregunta (el enfoque es el mismo):
Defina la clave en web.config:
Realice la llamada a la configuración de la aplicación directamente desde la página aspx:
fuente
Basado en la respuesta de Adam Tegan , modificado para su uso en una aplicación de formularios web.
En el código de clase .cs:
En el marcado aspx:
Y en el HTML renderizado, aparece como
fuente
Curiosamente, este mismo sitio tiene problemas con el enfoque que describe en relación con algunas configuraciones de proxy, aunque debería ser a prueba de fallas.
Consulte esta discusión sobre desbordamiento de metastack.
Entonces, a la luz de eso, podría tener sentido no usar un parámetro GET para actualizar, sino el nombre real del archivo:
aunque esto es más trabajo por hacer, ya que tendrá que crear el archivo o crear una reescritura de URL para él.
fuente
Quería un trazador de líneas simple para hacer que la ruta sea única para romper el caché. Esto funcionó para mí:
Si el archivo se ha modificado desde la última vez que se cargó en la página, el navegador extraerá el archivo actualizado.
Genera el
last modified
sello a partir del.js
archivo y lo coloca allí en lugar de la versión a la que puede que no sea fácil acceder.Otra opción podría ser obtener la suma de comprobación del archivo.
fuente
Este es un enfoque que funciona con ASP.NET 5 / MVC 6 / vNext .
Paso 1: Cree una clase para devolver la última hora de escritura del archivo, similar a otras respuestas en este hilo. Tenga en cuenta que esto requiere la inyección de dependencia ASP.NET 5 (u otra).
Paso 2: Registre el servicio que se inyectará dentro de startup.cs :
Paso 3: Luego, en ASP.NET 5, es posible inyectar el servicio directamente en una vista de diseño como _Layout.cshtml así:
Hay algunos toques finales que podrían hacerse para combinar mejor las rutas físicas y manejar el nombre del archivo en un estilo más consistente con la sintaxis, pero este es un punto de partida. Espero que ayude a las personas a migrar a ASP.NET 5.
fuente
He empleado una técnica ligeramente diferente en mi sitio aspnet MVC 4:
_ViewStart.cshtml:
Luego, en las vistas reales:
fuente
<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>
Esto me funciona en todos los navegadores. Aquí he usado PHP para generar números aleatorios. Puede utilizar su propio idioma del lado del servidor.
fuente
A partir de la respuesta anterior , modifiqué un poco el código para que el asistente también funcione con archivos CSS y agregue una versión cada vez que haga algún cambio en los archivos y no solo cuando realice la compilación.
fuente
Obtenga la hora de modificación del archivo, como se muestra a continuación
Agregue esto con input como querystring
Llame a esto desde el marcado.
Enfoque del asistente de extensión de MVC
Agregar un método de extensión
Agregue este espacio de nombres en web.config
Úselo en vista como
fuente
Sugerencias previas simplificadas y código para desarrolladores de .NET Web Forms.
Esto aceptará URL relativas ("~ /") y absolutas en la ruta del archivo al recurso.
Ponga en un archivo de clase de extensiones estáticas, lo siguiente:
Y luego llámelo en su página maestra como tal:
fuente
Basado en la respuesta anterior , escribí una pequeña clase de extensión para trabajar con archivos CSS y JS:
En lugar de escribir algo como:
Ahora puedes escribir:
Es decir, simplemente reemplácelo
Url.Content
conUrl.VersionedContent
.Las URL generadas tienen este aspecto:
Si usa la clase de extensión, es posible que desee agregar manejo de errores en caso de que la
MapPath
llamada no funcione, yacontentPath
que no es un archivo físico.fuente
Utilizo una forma similar de hacer lo mismo que estás haciendo sin modificar cada página. Se agregó un evento de PreRender en un archivo maestro. Mantiene mi lógica en un solo lugar y es aplicable a archivos js y css.
fuente
Puede invalidar la propiedad DefaultTagFormat de Scripts o Styles.
fuente
Para resolver este problema en mi aplicación ASP.Net Ajax, creé una extensión y luego llamé a la página maestra.
Para obtener más detalles, puede ir a través del enlace .
fuente
Una forma fácil e inteligente de implementar el control de versiones css en la aplicación .net mediante el concepto siguiente ... no es necesario escribir código de back-end.
fuente
El principal problema de hacerlo de esta manera es principalmente que deberá recordar actualizar su número de versión en su código cada vez que realice algún cambio en sus archivos css o js.
Una forma posiblemente mejor de hacerlo es establecer un parámetro único garantizado con cada uno de sus archivos css o js, así:
Esto obliga a que los archivos se soliciten al servidor cada vez, lo que también significa que su sitio no tendrá el mismo rendimiento cuando se cargue la página, ya que esos archivos nunca se almacenarán en caché y utilizarán ancho de banda innecesario cada vez.
Esencialmente, si puede recordar actualizar el número de versión cada vez que se realiza un cambio, puede salirse con la suya.
fuente
Para las páginas ASP.NET estoy usando lo siguiente
ANTES DE
DESPUÉS (forzar recarga)
Agregar DateTime.Now.Ticks funciona muy bien.
fuente