Как заставить пакеты System.Web.Optimization работать с пользовательскими папками в виртуальном каталоге IIS?
У меня есть asp.net mvc4. У меня есть модули, которые развернуты как подкаталоги в этом приложении с использованием виртуальных каталогов IIS, и мне нужно ссылаться на файлы в этих модулях. Эти модули DLL регистрируют пакеты. Но пакеты ничего не генерируют на html-странице.
Из этого постаэто-он-возможно к блоку испытания bundleconfig-в-mvc4 Я вижу, что внутренне пакеты используют Server.MapPath. Похоже, это должно работать.
Я подключил BundleTable.MapPathMethod и даже вызвал сам Server.MapPath, который правильно разрешает правильный физический каталог. Но он все равно ничего не отобразит на html-странице.
Потом был этот пост,почему-делает-resolvebundleurl-не-работа-для-пользовательских папок , в котором упоминается & quot; AddDirectory & quot; функция для пользовательских папок, НО эта функция больше не доступна в самой последней библиотеке оптимизации.
Я также пытался использовать новый "IncludeDirectory". метод, но это тоже не сработало
ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Что-нибудь еще, я могу попытаться заставить это работать?
8/27/12
ОТВЕТНАЯ ЗАДАЧА: В основном System.Web.Optimization не работает с веб-URL-адресами, которые являются виртуальными каталогами sub IIS.
Проблема в том, что эти строки кода внутри BundleResolver.GetBundleContents
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
это в основном предполагает, что каждый отдельный файл будет находиться в папке PHYSICAL под основной папкой PHYSICAL веб-приложения.
Проблема, IMO, заключается в том, что относительный путь URL-адреса в Интернете, в котором выполняется поиск включаемых файлов, очень рано преобразуется в физический путь, и все ссылки на то, какой относительный путь URL-адреса используется для получения этих физических файлов, отбрасываются.
Итак, чтобы посмотреть, смогу ли я сделать это, мне пришлось декомпилировать System.Web.Optimization до чистого кода, а затем перекомпилировать снова, чтобы я мог «исправить» Это. Первым шагом было добавление свойства RelativePath в BundleItem, дополнительный конструктор для BundleItem, чтобы передать исходный относительный путь URL-адреса, чтобы сохранить папку каталога относительного поиска в Интернете. Затем я заменил приведенный выше код на цикл перед тем, как он в основном пытается сопоставить файлы, найденные с их BundleItem, чтобы они могли быть преобразованы обратно в действительный веб-URL
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;
}
}
Теперь мои связки корректно отображаются. Однако учтите, что я еще не тестировал это хак-исправление для релиза или с оптимизацией или минимизацией.
Я действительно считаю, что команда asp.net должна создать файлы поддержки System.Web.Optimizations в виртуальных каталогах IIS. Особенно теперь, когда VS2012 имеет поддержку IIS Express, которая, наконец, значительно упростит создание модульных веб-приложений с файлами, на которые ссылаются виртуальные каталоги IIS.