我有一个asp.net mvc4应用程序。 我有模块以IIS虚拟目录的形式部署在此应用程序中,并且我需要引用这些模块中的文件。 这些模块的dll正在注册bundles。但是,这些bundles没有生成任何内容到html页面中。
从此帖子 is-it-possible-to-unit-test-bundleconfig-in-mvc4 中,我看到bundles内部使用了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);
还有其他我可以尝试的方法使这个工作吗?
2012年8月27日
问题已解决:基本上,System.Web.Optimization无法处理位于IIS虚拟目录下的Web URL。
问题出现在BundleResolver.GetBundleContents中的这些代码行中。
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
这基本上假设每个要打包的文件都在主Web应用程序物理文件夹下面的一个物理文件夹中。
问题在于,我认为搜索要包含的文件的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;
}
}
现在我的bundle正确地渲染了。请注意,我尚未测试此hack修复程序是否适用于发布或启用优化或文件缩小。
我真的认为asp.net团队应该使System.Web.Optimizations支持IIS虚拟目录中的文件。特别是现在VS2012已经支持IIS Express,这将最终使使用IIS虚拟目录引用文件的模块化Web应用程序更加容易。