如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?
Posted
技术标签:
【中文标题】如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?【英文标题】:How do I get System.Web.Optimization bundles to work with custom folders in an IIS virtual directory? 【发布时间】:2012-08-19 11:51:20 【问题描述】:我有一个 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 虚拟目录的 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 虚拟目录引用文件
【问题讨论】:
感谢您跟踪此问题,我将提交此问题的错误,我们会修复它 @HaoKung,你有bug票的参考吗?只需要知道我们什么时候可以看到修复发布。谢谢。 您可以使用这个:aspnetoptimization.codeplex.com/workitem/12,因为这基本上将作为支持该功能的 VirtualPathProviders 的一部分得到修复 看看这个***.com/questions/19765238/… 我试图了解您是如何解决这个问题的,但我似乎无法理解根本问题在哪里。 ***.com/questions/31282221/… 。您的答案是我得到的最接近的答案,但我不明白如何更改您在System.Web.Optimizations
中更改的内容@
【参考方案1】:
AddDirectory 已重命名为 IncludeDirectory,因此您仍然可以尝试。
【讨论】:
我已经尝试过了,但也没有用。我只是再次尝试以确保它不起作用。我已将该代码 sn-p 粘贴到 OP 中。【参考方案2】:如果配置正确,您应该可以使用 virtualPathProvider 来完成此操作。
有关如何注册的信息,请在此处查看我的答案:BundleTable.Bundles.GetBundleFor() returns but not Items inside
【讨论】:
以上是关于如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?的主要内容,如果未能解决你的问题,请参考以下文章