Как получить пакеты 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.

Затем был этот пост why-does-resolvebundleurl-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))

который в основном предполагает, что каждый связанный файл будет находиться в папке 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.

Ответы

Ответ 1

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