如何将System.Web.Optimization绑定与IIS虚拟目录中的自定义文件夹配合使用?

11

我有一个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应用程序更加容易。


感谢您追踪此问题,我将为此问题提交一个错误报告,并进行修复。 - Hao Kung
@HaoKung,你有这个错误票据的参考吗?只需要知道我们可以期待何时发布修复。谢谢。 - Zephyr was a Friend of Mine
1
你可以使用这个链接:http://aspnetoptimization.codeplex.com/workitem/12 作为支持虚拟路径提供程序的一般功能的一部分。 - Hao Kung
请查看此链接:https://dev59.com/WWIj5IYBdhLWcg3w6JHU - DJ.
我正在尝试理解您是如何解决这个问题的,但似乎我无法理解其中的根本问题所在。https://dev59.com/24zda4cB1Zd3GeqPqsb5。您的答案是我得到的最接近的答案,但我不知道如何更改您在“System.Web.Optimizations”中更改的内容。 - skmasq
2个回答

0

0

AddDirectory已更名为IncludeDirectory,因此您仍然可以尝试使用它。


我已经尝试过了,但那也不起作用。我刚刚再次尝试以确保它不起作用。我已将该代码片段粘贴到 OP 中。 - happyfirst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接