Как заставить пакеты System.Web.Optimization работать с настраиваемыми папками в виртуальном каталоге IIS?

У меня есть 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.


person happyfirst    schedule 23.08.2012    source источник
comment
Спасибо за отслеживание, я сообщу об ошибке, и мы ее исправим.   -  person Hao Kung    schedule 28.08.2012
comment
@HaoKung, у вас есть ссылка на запись об ошибке? Просто нужно знать, когда мы можем ожидать выхода исправления. Спасибо.   -  person Noel Abrahams    schedule 03.09.2012
comment
Вы можете использовать это: aspnetoptimization.codeplex.com/workitem/12, так как это в основном будет исправлено как часть поддержки VirtualPathProviders в целом для функции   -  person Hao Kung    schedule 08.09.2012
comment
Ознакомьтесь с этим stackoverflow.com/questions/19765238 /   -  person DJ.    schedule 24.01.2015
comment
Я пытаюсь понять, как вы решили эту проблему, но я не могу понять, в чем основная проблема. stackoverflow.com/ вопросы/31282221/ . Ваш ответ самый близкий, который я получил, но я не понимаю, как изменить то, что вы изменили в System.Web.Optimizations   -  person skmasq    schedule 09.07.2015


Ответы (2)


AddDirectory был переименован в IncludeDirectory, поэтому вы все еще можете попробовать это.

person Hao Kung    schedule 24.08.2012
comment
Я уже пробовал это, но это тоже не сработало. Я только что попробовал еще раз, чтобы убедиться, и это не работает. Я вставил этот фрагмент кода в OP. - person happyfirst; 24.08.2012

Вы сможете сделать это с помощью virtualPathProvider, если правильно его настроите.

См. мой ответ здесь для получения информации о том, как его зарегистрировать: BundleTable.Bundles. GetBundleFor() возвращает, но не элементы внутри

person Ron DeFreitas    schedule 17.02.2015