.net - manager - system web infrastructure nuget
¿Cómo obtengo que los paquetes System.Web.Optimization funcionen con carpetas personalizadas en un directorio virtual de IIS? (2)
Se ha cambiado el nombre de AddDirectory IncludeDirectory por lo que aún podrías intentarlo.
Tengo un asp.net mvc4. Tengo módulos que se implementan como subdirectorios dentro de esta aplicación utilizando IIS Virtual Directories y necesito hacer referencia a los archivos en estos módulos. Estos módulos dlls están registrando paquetes. Pero los paquetes no generan nada en la página html.
Desde esta publicación, is-it-possible-to-unit-test-bundleconfig-in-mvc4 , veo que internamente los paquetes están usando Server.MapPath. Entonces parece que debería funcionar.
Conecté BundleTable.MapPathMethod e incluso llamé a Server.MapPath, que se resuelve correctamente en el directorio físico correcto. Pero aún no generará nada en la página html.
Luego estaba esta publicación, why-does-resolvebundleurl-not-work-for-custom-folders , que mencionaba una función "AddDirectory" para carpetas personalizadas PERO esta función ya no está disponible en la biblioteca de optimización más reciente.
También intenté hacer uso del nuevo método "IncludeDirectory", pero eso tampoco funcionó
ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
¿Alguna otra cosa puedo intentar hacer que esto funcione?
8/27/12
RESPUESTA DEL PROBLEMA: Básicamente System.Web.Optimization no funciona con URLs web que son directorios virtuales sub IIS.
El problema son estas líneas de código dentro de BundleResolver.GetBundleContents
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
que básicamente asume que cada archivo individual que se incluye estará en una carpeta FÍSICA debajo de la carpeta PHYSICAL de la aplicación web primaria.
El problema, IMO, es que la ruta de la URL relativa a la web que se busca para los archivos que se incluirán se está convirtiendo a una ruta física desde el principio y se descarta toda referencia a la ruta url relativa utilizada para obtener esos archivos físicos.
Entonces, para ver si podía hacer esto, tuve que descompilar System.Web.Optimization en código simple y luego volver a compilarlo para poder "arreglarlo". El primer paso fue agregar una propiedad RelativePath a BundleItem, un constructor adicional para BundleItem para pasar la ruta url relativa de origen para preservar lo que era la carpeta del directorio de búsqueda relativa de la web. Luego reemplacé el código anterior con el bucle anterior que, básicamente, intenta volver a emparejar los archivos encontrados con su BundleItem para que puedan convertirse de nuevo a una URL web válida
foreach (BundleItem bundleItem in bundleFor.Items)
{
if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
str = str.Replace(''//', ''/'');
strs.Add(str);
break;
}
}
Ahora mis paquetes están renderizando correctamente. Sin embargo, tenga en cuenta que aún no he probado este truco de corrección para su lanzamiento o con optimizaciones o minificación.
Realmente creo que el equipo de asp.net debería hacer que System.Web.Optimizations admita archivos en los directorios virtuales de IIS. Especialmente ahora que el VS2012 tiene soporte para IIS Express que finalmente hará que sea mucho más fácil construir aplicaciones web modulares con archivos a los que se hace referencia a través de los directorios virtuales de IIS.
Debería poder lograr esto usando un virtualPathProvider si lo configura correctamente.
Consulte mi respuesta aquí para obtener información sobre cómo registrarlo: BundleTable.Bundles.GetBundleFor () devuelve pero no Elementos dentro