启用搜索子目录时,ASP.NET的ScriptBundle .IncludeDirectory
方法中是否存在最大文件名长度?
当我包含一个具有长描述性名称的文件然后启动项目时,我的Visual Studio 2013 Professional开始加载所有内容,但是一旦开始加载.js文件,VS就会挂起而不会在浏览器中加载网站。但是,当我修剪我使用.IncludeDirectory
的文件夹中的.js文件的较长名称时,它似乎运行良好。但我可能会离开。还有其他人遇到过这种行为吗?你怎么修好它的?
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new ScriptBundle("~/bundles/angularapp")
.IncludeDirectory("~/AngularApp", "*.js", true));
}
文件夹
显然,我的项目包含更多文件和比这更深的文件结构。但是我试图从一个非常大的.IncludeDirectory
块中明确地包含每个.js文件转换到.Include
。
答案 0 :(得分:1)
我有这样的结构:
我试着用这个:
bundles.Add(new ScriptBundle("~/bundles/myScripts").Include(
"~/Scripts/ng-google-chart.js",
"~/Scripts for myapp/my_scripts.js"
)
// WARN: this one fail
.IncludeDirectory("~/Scripts for myapp/Angular", "*.js", true)
);
失败了。 如果我在单独的行中使用 IncludeDirectory ,则会失败:
@Scripts.Render("~/bundles/myscripts")
Angular目录只包含.js文件,并且没有空目录,除了下划线之外,名称中没有奇怪的字符。
我使用.IncludeDirectory sintax解决了没有searchSubdirectories参数的问题,这是对每个子目录的调用。
ScriptBundle myBundle = bundles.GetBundleFor("~/bundles/myScripts") as ScriptBundle;
myBundle.IncludeDirectory("~/Scripts for myapp/Angular/controllers", "*.js");
myBundle.IncludeDirectory("~/Scripts for myapp/Angular/directives", "*.js");
[...]
它有效,所以路径和文件是正确的。它只是在子目录中搜索失败的方法。
我假设你正在打电话
BundleConfig.RegisterBundles(BundleTable.Bundles);
在Global.asax的Application_Start中。
要查找错误,请尝试附加调试器并在该调用之前的某处放置一个断点。 可能你会有一个 System.Web.HttpException (实际上每个子目录都有一个):
文件监控的文件名无效:'[应用程序的路径] \ mywebapp \ myapp \ Angular \ controllers'的脚本。 失败的常见原因包括: - 文件名不是有效的Win32文件名。 - 文件名不是绝对路径。 - 文件名包含通配符。 - 指定的文件是目录。 - 拒绝访问。
在我的情况下,这些原因似乎都没有效果,我可以使用没有“子文件夹搜索”的方法注册子文件夹的内容。 (提示。要再次触发Application_Start,只需在web.config中添加/删除一个空行。)
请注意,此异常不会阻止ASP引擎,在我的情况下,页面在浏览器中呈现,您只是看不到错误。我注意到它,因为在Application_Start中我做了其他操作而且它们没有被执行。
我不知道错误的真正原因,但这是你如何找到它以及适用于我的解决方法。
提示。要排除Jasmine测试文件,我使用它(在其他命令之后): bundles.IgnoreList.Ignore(“* _ jasmine.js”,OptimizationMode.Always);