.net - 如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?

标签 .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。所以它似乎应该工作。

我 Hook 了 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 应用程序 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 虚拟目录引用

最佳答案

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

关于.net - 如何让 System.Web.Optimization 包与 IIS 虚拟目录中的自定义文件夹一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12100524/

相关文章:

ASP.NET Bundles 如何禁用缩小

asp.net-mvc - 本地化的脚本包解决方案

c# - WMI .NET 无效查询

.net - 毛伊岛 : How to prevent navigating away from a page with unsaved data?

c# - 如何在 ASP.Net MVC 5 应用程序中从浏览器获取 URL

c# - MVC 4 Razor _Layout.cshtml 仅对一页使用 HTML 部分

asp.net-mvc-4 - 捕获并记录有关 "Minification failed. Returning unminified contents"的 MVC4 消息

c# - 如何调用具有数据绑定(bind)的通用方法?

c# - 是否存在用于 Asc 或 Desc 排序的枚举?

asp.net-mvc - 如何在 Visual Studio 2017 中创建 MVC 项目?