У меня есть asp.net mvc4. У меня есть модули, которые развернуты как подкаталоги в этом приложении с использованием виртуальных каталогов IIS, и мне нужно ссылаться на файлы в этих модулях. Эти DLL-модули регистрируют пакеты. Но пакеты ничего не генерируют на html-странице.
Из этого сообщения is-it-possible-to-unit- test-bundleconfig-in-mvc4 , я вижу, что внутри пакеты используют Server.MapPath. Так вроде должно работать.
Я подключил BundleTable.MapPathMethod и даже сам вызвал Server.MapPath, который правильно разрешает правильный физический каталог. Но он все равно ничего не отобразит на html-странице.
Затем был этот пост, not-work-for-custom-folders , в котором упоминалась функция «AddDirectory» для пользовательских папок, НО эта функция больше не доступна в самой последней библиотеке оптимизации.
Я также пытался использовать новый метод «IncludeDirectory», но это тоже не сработало.
ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Что-нибудь еще я могу попробовать сделать эту работу?
8/27/12
ОТВЕТ ПРОБЛЕМЫ: В основном System.Web.Optimization не работает с веб-адресами, которые являются суб-виртуальными каталогами IIS.
Проблема в этих строках кода внутри BundleResolver.GetBundleContents.
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
это в основном предполагает, что каждый отдельный файл в комплекте будет находиться в ФИЗИЧЕСКОЙ папке под основной ФИЗИЧЕСКОЙ папкой веб-приложения.
Проблема, IMO, заключается в том, что относительный путь URL-адреса в Интернете, который ищется для включения файлов, очень рано преобразуется в физический путь, и все ссылки на то, какой относительный путь URL-адреса использовался для получения этих физических файлов, отбрасываются.
Итак, чтобы увидеть, смогу ли я заставить это работать, мне пришлось декомпилировать System.Web.Optimization до чистого кода, а затем снова перекомпилировать, чтобы я мог «исправить» это. Первым шагом было добавление свойства RelativePath к BundleItem, дополнительного конструктора к BundleItem, чтобы передать исходный относительный путь URL-адреса, чтобы сохранить то, чем была папка каталога относительного веб-поиска. Затем я заменил приведенный выше код циклом, прежде чем он в основном пытается сопоставить файлы, найденные с их BundleItem, чтобы их можно было преобразовать обратно в действительный веб-адрес.
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.
System.Web.Optimizations
- person skmasq   schedule 09.07.2015