mail - Integración de ASP.NET: el paquete no se actualiza después de que el archivo incluido ha cambiado(devuelve 304 no modificado)
enviar correo gmail c# asp net (13)
Estoy probando ASP.NET Bundling con la aplicación ASP.NET MVC 4. La situación es que quiero crear un servicio de estilo CDN, que tenga archivos JS y CSS a los que pueda dirigirse desde otros sitios con este tipo de dirección: http://www.mycdn.com/scripts/plugin/js , que agrupa y minimiza todos los archivos .js incluidos.
La configuración de mi paquete para un archivo se ve así:
bundles.Add(new ScriptBundle("~/Scripts/plugin/pluginjs").Include("~/Scripts/plugin/jquery.plugin.js"));
Sin embargo, cuando hago esto, los paquetes no se actualizan incluso después de cambiar los archivos js originales. Sigo recibiendo 304 Not Modified, cuando actualizo mi navegador, y el contenido del archivo modificado no se actualiza. ¿Cómo puedo hacer que los paquetes se actualicen, porque es inútil tener paquetes con contenido antiguo? Probé en todos los sentidos, pero no pude encontrar una solución.
¡Gracias por adelantado!
De acuerdo, esta es mi historia. Inhabilité la generación de archivos min para menos archivos en Web Essentials. Los archivos min. Antiguos no se eliminaron, y bundle thingy vio aquellos en lugar de CSS actualizado. ¡Buena suerte!
EDITAR
Algún tiempo después, pasé otras dos horas buenas en el mismo tema. Esta vez fue mi culpa, supongo. Me olvidé de la tilde líder, es decir, escribí
Scripts.Render("/js/script")
en lugar de
Scripts.Render("~/js/script")
Por alguna razón, a veces funcionaba, y otras veces no existía.
De hecho, decidí no usar System.Web.Optimization para esta tarea, pero encontré Microsoft Ajax Minifier, que también está incluido en WebGrease.dll, que viene con la biblioteca MVC4 System.Web.Optimization. Escribí la siguiente función, que luego llamé en Application_Start para cada archivo modificado:
public static void MinifyFile(string virtualPath)
{
string fullPath = HttpContext.Current.Server.MapPath(virtualPath);
string extension = Path.GetExtension(fullPath).ToLower();
string targetPath = fullPath.Substring(0, fullPath.Length - extension.Length) + ".min" + extension;
if(File.Exists(fullPath) == false)
{
throw new FileNotFoundException("File not found: " + fullPath);
}
string input = File.ReadAllText(fullPath);
string output;
if (extension == ".js")
{
Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
output = jsmin.MinifyJavaScript(input);
}
else if (extension == ".css")
{
Microsoft.Ajax.Utilities.Minifier jsmin = new Microsoft.Ajax.Utilities.Minifier();
output = jsmin.MinifyStyleSheet(input);
}
else
{
throw new NotSupportedException(extension + " is not supported for minification.");
}
File.WriteAllText(targetPath, output);
}
Ahora, mi aplicación está minificando todos los archivos en Application_Start.
Después de luchar para descubrir qué hace que el caché del paquete se actualice, llegué a unas pocas conclusiones que con suerte ayudarán a otros:
Si los archivos .min se incluyen como parte del paquete:
- modo de lanzamiento + cambiar código min js = actualización de caché
- modo de lanzamiento + cambio no mínimo código js = sin actualización de caché
- modo de depuración + cambio código min js = no actualización de caché
- modo de depuración + cambio no mínimo código js = sin actualización de caché
Si los archivos .min NO están incluidos como parte del paquete:
- modo de depuración + cambio de código js = sin actualización de caché
- modo de lanzamiento + cambiar código js = actualización de caché
Notas
- Por modo de depuración me refiero a la depuración de compilación web.config = true (y BundleTable.EnableOptimizations = false o se omite)
- Por modo de liberación me refiero a la compilación web.config debug = false (y BundleTable.EnableOptimizations = true o se omite
- Asegúrate de estar haciendo cambios en el código. Los cambios como espacios y comentarios no afectan a los js minificados resultantes, por lo que el servidor es correcto en cuanto a que no hay cambios (por lo tanto, el caché del paquete no se actualiza).
El problema para mí fue que tenía Fiddler funcionando. Después de cerrar dit y reconstruir mi solución, estaba cargando los cambios en el archivo js para mí.
La operación de agrupamiento distingue entre mayúsculas y minúsculas. Asegúrese de que el nombre de archivo tenga el estuche adecuado.
Tuve que cambiar una línea en mi BundleConfig.cs:
bundles.Add(new StyleBundle("~/Content/css").Include(
"~/Content/bootstrap.css",
"~/Content/Site.css")); <-- Uppercased.
No estoy seguro de que la característica actual sea realmente compatible con ser CDN, ya que se basa implícitamente en la url para contener un código hash para evitar el almacenamiento en caché del navegador.
Pero puedo intentar ayudarte a intentar llegar allí, y tal vez sea posible hoy ... Un problema que podría ser un obstáculo es que BundleHandler devolverá 304 en cualquier solicitud de paquete que contenga el encabezado IfLastModified, ya que se supone que la memoria caché del navegador siempre es válida debido a la huella digital en la url.
¿Puede agregar algunos detalles sobre cómo está representando las referencias a los paquetes? ¿Estás usando algo como Scripts.Render ("~ / Scripts / plugin / pluginjs")?
La etiqueta de secuencia de comandos del paquete debe tener un aspecto similar a este:
Good: <script src="/fbt/bundles/js?v=wvLq7H7qEZB2giyIRn7aEZAxhHOb2RfTYYh2HMd9EqM1"></script>
Si las etiquetas de secuencia de comandos hacen referencia al paquete sin formato sin cadena de versión, eso probablemente explicaría los problemas de almacenamiento en caché que está viendo:
Not good: <script src="/fbt/bundles/js></script>
Por lo que vale, tuve el mismo problema ahora con un archivo js que inexplicablemente se niega a actualizar sin importar qué (reconstrucción, caché forzado, etc.). Después de un tiempo, cambié las herramientas de depuración del cliente en IE en (F12) para comenzar a ver el tráfico de la red, y esta sola acción forzó al archivo JS a actualizarse. Ve figura, pero funcionó.
Sé que ha pasado un tiempo desde que se actualizó, pero he descubierto que solo necesito esperar unos segundos para que el paquete se ponga al día con mis cambios de CSS. Tengo los archivos bootstrap less compilados en un css y min.css y definitivamente no es instantáneo para ver mis cambios. Para mí, fue de unos 10 segundos en una PC rápida con un ssd. Sus millas pueden variar en función de las especificaciones de su sistema.
Simplemente actualice su System.Web.Optimization by NuGet
Simplemente tuve exactamente el mismo problema. Tengo una carpeta con 2 archivos CSS:
- ~ / Content / main.css
- ~ / Content / main.min.css (preexistente de mi proceso de minificación manual anterior)
Mi código de agrupamiento es este:
bundles.Add(new StyleBundle("~/css/main").Include("~/content/main.css"));
No importa cuánto cambie mi main.css
la salida fue la misma URL con los mismos contenidos:
<link href="/css/main?v=6Xf_QaUMSlzHbXralZP7Msq1EiLTd7g1vId6Vcy8NJM1" rel="stylesheet"/>
La única forma de actualizar el paquete fue reconstruir mi solución, obviamente no es el mejor enfoque.
Sin embargo, tan pronto como main.min.css
, todo comenzó a funcionar bien. Jugando un poco más descubrí que si hay tanto main.css
como main.min.css
, actualizar main.min.css
actualizará el paquete ... Rareza, pero al menos predecible.
Tenga en cuenta que si usa Google Chrome, el almacenamiento en caché es bastante agresivo. Para asegurarse de que no se almacena nada en la memoria caché, puede hacer Ctrl-Shift-I
para abrir el panel del desarrollador. Vaya a la Network
y haga clic en Disable Cache
. Asegúrate de mantener esto abierto. Ahora actualiza la página. Su memoria caché debe borrarse y los cambios en el archivo deben reflejarse ahora.
Tuve un problema similar. En mi situación, tenía un archivo CSS al que se hacía referencia en un paquete de estilos y tenía ese paquete al que se hacía referencia en mi vista de MVC. También tuve el indicador "EnableOptimizations" establecido en falso en el código del paquete.
A pesar de todo esto, la vista se negó a actualizar para incluir el nuevo archivo CSS.
Mi solución fue crear una versión miniaturizada del archivo CSS e incluirlo en el proyecto y comenzó a funcionar. No tengo idea de por qué este sería el caso, ya que ese archivo miniaturizado no se menciona en ningún lugar (incluso después de que se actualizó la vista) y ni siquiera se debe considerar ya que el código está configurado para no optimizarse. Es muy probable que sea un error (o una característica) de la funcionalidad de agrupación. Espero que esto ayude a alguien más a encontrarse con este problema.
Vi esta respuesta, pero ninguno de estos fue el caso para mí. Había ciertas reglas de CSS que hacían que el bundler de estilos fallara y recibía el mismo hash, incluso si hacía cambios en el archivo CSS. Todo estaba funcionando correctamente antes para mí.
En mi caso, la regla del selector css violador fue:
#globalSearch.searching { ... }
Si hice esto solo
.searching { ... }
Todo vuelve a funcionar y cualquier cambio que realice en mi archivo CSS, el hash del paquete cambia correctamente. Solo agregue esta respuesta ya que podría ayudar a alguien.