hap*_*rst 11 .net asp.net-mvc-4 asp.net-optimization system.web.optimization
我有一个asp.net mvc4.我有使用IIS虚拟目录在此应用程序中部署为子目录的模块,我需要引用这些模块中的文件.这些模块dll正在注册捆绑包.但捆绑包不会在html页面中生成任何内容.
从这篇文章中可以看出,它可能是单元测试-bicleconfig-in-mvc4,我看到内部捆绑包正在使用Server.MapPath.所以它似乎应该工作.
我连接了BundleTable.MapPathMethod,甚至自己调用了Server.MapPath,它正确地解析到了正确的物理目录.但它仍然不会在html页面中呈现任何内容.
然后就是这篇帖子,为什么做了解决方案,不为自定义文件夹工作,提到自定义文件夹的"AddDirectory"功能但是这个功能在最新的优化库中不再可用.
我也试过使用新的"IncludeDirectory"方法,但这也不起作用
ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Run Code Online (Sandbox Code Playgroud)
还有什么我可以尝试使这项工作?
12年8月27日
问题解答:基本上,System.Web.Optimization不适用于作为子IIS虚拟目录的Web URL.
问题是BundleResolver.GetBundleContents中的这些代码行
string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)
这基本上假设捆绑的每个文件都位于主Web应用程序PHYSICAL文件夹下的PHYSICAL文件夹中.
IMO的问题在于,正在搜索要包含的文件的Web相对URL路径很早就被转换为物理路径,并且所有对用于获取这些物理文件的相对URL路径的引用都被丢弃了.
所以,为了看看我是否可以完成这项工作,我不得不将System.Web.Optimization反编译为裸代码,然后再重新编译,以便我可以"修复"它.第一步是将一个RelativePath属性添加到BundleItem,这是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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的捆绑包正在渲染.但请注意,我尚未测试此hack修复程序是否已发布或已进行优化或缩小.
我真的认为asp.net团队应该在IIS虚拟目录中制作System.Web.Optimizations支持文件.特别是现在VS2012支持IIS Express,最终使构建模块化Web应用程序变得更容易,文件通过IIS虚拟目录引用
归档时间: |
|
查看次数: |
3719 次 |
最近记录: |