14

estoy tonteando con las nuevas características de ASP.NET agrupación (utilizando el System.Web.Optmization 1.0.0-beta pre-lanzamiento) en mi aplicación web ASP.NET MVC 3.Nuevas características de agrupación de ASP.NET: ¿cómo puedo actualizar de forma programada un determinado paquete?

funciona muy bien.

Sin embargo, tenemos cierto dinámico CSS/JS que se almacena en la base de datos.

quiero conseguir esto, añadido a un paquete separado para mi paquete central, diga "DynamicBundle". Sé cómo hacer eso, no es un problema.

Ahora mi pregunta es, cuando se cambia este CSS/JS en la base de datos, ese paquete tiene que ser "refrescado", por lo que el contenido de esos archivos se vuelven a leer en el paquete.

Esencialmente, necesito ASP.NET para volver a generar esa magia GUID/cadena que se añade a la URL paquete.

Idealmente, solo me gustaría actualizar un paquete específico, no toda la tabla de paquetes.

¿Hay alguna manera de hacerlo?

EDIT:

Vale segundo problema, no puede encontrar la manera de añadir la dinámica CSS/JS para el paquete. bundle.AddFile toma un camino virtual a un archivo, pero no es un archivo físico, que es una cadena. ¿Cómo voy a hacer esto? Seguramente no tengo que escribir cadena en los archivos primero?

EDIT 2: Así que he decidido no agrupar mi contenido dinámico. Por 2 razones:

  1. Es sólo 1 archivo, así que no estoy ganando ninguna "agrupación" beneficia
  2. Agrupación está diseñado para el contenido estático, esto no es

Así que lo que he hecho es minified manualmente mis css/js dinámicos en el tiempo de ejecución (una vez, luego caché). De esa manera puedo actualizarlo fácilmente, simplemente borrando el caché.

Dicho esto, esto sigue siendo una cuestión relevante (refrescante paquetes) por lo que voy a dejar abierta ..

+0

Parece un controlador personalizado que escupe el JS/CSS dinámico podría ser mejor para usted. Así es como funcionan otros motores que generan JS en tiempo de ejecución (por ejemplo, Ajax.NET Pro hace esto: http://ajaxpro.codeplex.com/). Alternativamente, puede usar una página .aspx simple que devuelve el contenido dinámico, y establece los encabezados de caché para que no caché para que el cliente lo solicite todo el tiempo. – nothingisnecessary

Respuesta

5

que "ese GUID mágica/cadena" es un hash de los contenidos de los archivos combinados.

Puede probar esto con el siguiente flujo de trabajo, que se supone que tiene un mybundle.css. Si utiliza Fiddler para ver el tráfico, verá que solicitar algo con un hash como

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Ahora, "toque" uno de los archivos en el paquete de todo lo que desee sin tener que cambiar el contenido. El archivo es más nuevo (LastModified/LastWrite es más reciente), pero el hash permanece constante ya que se calcula a partir de los mismos contenidos combinados. Incluso podría agregar espacios al archivo ya que estos se minimizarían.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

A continuación, en realidad hacen un cambio.Tal vez establezca un borde en 2px en lugar de 1px. El hash cambiará ahora, ya que los contenidos que alimentan el hash han cambiado.

http://localhost:20206/mybundle.css?v=-4725541136976015445 

Finalmente, establezca el borde de nuevo en lo que era (en el ejemplo anterior, vuelva a 1px). La "cuerda mágica" en realidad no es aleatoria o mágica en absoluto. En su lugar, vuelve al hash de un sentido coincidente calculado a partir de los contenidos.

http://localhost:20206/mybundle.css?v=-6520265193368900210 

Ahora puede estar tranquilo porque el hash solo se actualizará cuando sea necesario, sin intervención manual.

cuanto a la otra parte de su pregunta,

cuando este CSS/JS se cambia en la base de datos, ese paquete tiene que ser "refrescados", por lo que el contenido de esos archivos se vuelven a leer en el paquete .

Creo que invertimos el pensamiento. En lugar de actualizar el paquete para activar una nueva lectura, actualizamos los archivos para activar la actualización. Cuando ASP.NET vea que los archivos cambian, recombinará los contenidos y actualizará el hash.

+1

Sé cómo hacer esto, pero le pregunté cómo hacerlo ** programáticamente **. ¿Sugiere que "toque" el archivo en el código de la aplicación real? E.g StreamWriter cosas? – RPM1984

+0

El punto de mi respuesta es que no necesitas hacer lo que crees que debes hacer ... la cadena no es "mágica". Lo que está incluido en el paquete, si cambia, la "cadena mágica" se actualizará en función de esos contenidos. –

+0

Un toque no es suficiente, ya que realmente necesita cambiar los contenidos. Puede usar un 'StreamWriter' para guardar los contenidos modificados de la base de datos en archivos físicos, en cuyo caso el hash se encargará solo. –

3

Tengo buenas noticias para usted. Muchas personas han estado solicitando soporte para proveedores de rutas virtuales para escenarios similares a los suyos, donde tienen contenido que no es necesariamente del disco, por lo que actualmente estamos planeando respaldar VPP en la próxima versión.

Para aprovechar este soporte, deberá implementar un VPP para su js/css dinámico.

VPP también tiene mecanismos de dependencia de caché integrados, por lo que debería poder utilizarlos para vaciar automáticamente la entrada de caché de paquete correcta para usted.

Cuestiones relacionadas