如何使用System.Web.Optimization包来处理IIS虚拟目录中的自定义文件夹?

hap*_*rst 11 .net asp.net-mvc-4 asp.net-optimization system.web.optimization

我有一个asp.net mvc4.我有使用IIS虚拟目录在此应用程序中部署为子目录的模块,我需要引用这些模块中的文件.这些模块dll正在注册捆绑包.但捆绑包不会在html页面中生成任何内容.

从这篇文章中可以看出,它可能是单元测试-bicleconfig-in-mvc4,我看到内部捆绑包正在使用Server.MapPath.所以它似乎应该工作.

我连接了BundleTable.MapPathMethod,甚至自己调用了Server.MapPath,它正确地解析到了正确的物理目录.但它仍然不会在html页面中呈现任何内容.

然后就是这篇帖子,为什么做了解决方案,不为自定义文件夹工作,提到自定义文件夹的"AddDirectory"功能但是这个功能在最新的优化库中不再可用.

我也试过使用新的"IncludeDirectory"方法,但这也不起作用

ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Run Code Online (Sandbox Code Playgroud)

还有什么我可以尝试使这项工作?


12年8月27日

问题解答:基本上,System.Web.Optimization不适用于作为子IIS虚拟目录的Web URL.

问题是BundleResolver.GetBundleContents中的这些代码行

string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)

这基本上假设捆绑的每个文件都位于主Web应用程序PHYSICAL文件夹下的PHYSICAL文件夹中.

IMO的问题在于,正在搜索要包含的文件的Web相对URL路径很早就被转换为物理路径,并且所有对用于获取这些物理文件的相对URL路径的引用都被丢弃了.

所以,为了看看我是否可以完成这项工作,我不得不将System.Web.Optimization反编译为裸代码,然后再重新编译,以便我可以"修复"它.第一步是将一个RelativePath属性添加到BundleItem,这是BundleItem的一个额外构造函数,用于传递源相对url路径以保留Web相对搜索目录文件夹的内容.然后我用循环替换上面的代码,然后基本上尝试重新匹配用BundleItem找到的文件,以便它们可以转换回有效的web 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我的捆绑包正在渲染.但请注意,我尚未测试此hack修复程序是否已发布或已进行优化或缩小.

我真的认为asp.net团队应该在IIS虚拟目录中制作System.Web.Optimizations支持文件.特别是现在VS2012支持IIS Express,最终使构建模块化Web应用程序变得更容易,文件通过IIS虚拟目录引用

Hao*_*ung 0

AddDirectory 已重命名为 IncludeDirectory,因此您仍然可以尝试。