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

时间:2012-08-23 21:52:37

标签: .net asp.net-mvc-4 asp.net-optimization system.web.optimization

我有一个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);

我可以尝试其他任何工作吗?


12年8月27日

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

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果正确配置,您应该可以使用virtualPathProvider完成此操作。

有关如何注册的信息,请参阅我的答案:BundleTable.Bundles.GetBundleFor() returns but not Items inside