11

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

从这篇文章is-it-possible-to-unit-test-bundleconfig-in-mvc4 中,我看到包在内部使用 Server.MapPath。所以它似乎应该工作。

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

然后有这篇文章,为什么-does-resolvebundleurl-not-work-for-custom-folders,提到了自定义文件夹的“AddDirectory”功能,但是这个功能在最新的优化库中不再可用。

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

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

还有什么我可以尝试的吗?


2012 年 8 月 27 日

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

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

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

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

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

所以,为了看看我能不能完成这项工作,我必须将 System.Web.Optimization 反编译为裸代码,然后再次重新编译,这样我才能“修复”它。第一步是向 BundleItem 添加一个 RelativePath 属性,这是一个额外的 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;
  }
}

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

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

4

2 回答 2

0

如果您正确配置它,您应该能够使用 virtualPathProvider 完成此操作。

有关如何注册它的信息,请参阅我的答案:BundleTable.Bundles.GetBundleFor() 返回但不是里面的项目

于 2015-02-17T19:51:28.867 回答
0

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

于 2012-08-24T17:43:49.467 回答