【问题标题】:ScriptBundle IncludeDirectory Length Maximum For Filenames?ScriptBundle IncludeDirectory 文件名的最大长度?
【发布时间】:2014-10-15 14:24:21
【问题描述】:

启用搜索子目录时,ASP.NET 的 ScriptBundle .IncludeDirectory 方法中是否有最大文件名长度?

当我包含一个具有长描述性名称的文件然后启动项目时,我的 Visual Studio 2013 Professional 开始加载所有内容,但是一旦它开始加载 .js 文件,VS 就会挂起,而不会在浏览器中加载网站.但是,当我在我使用过的文件夹中修剪 .js 文件的较长名称时,.IncludeDirectory 似乎运行良好。但我可能会离开。有没有其他人遇到过这种行为?你怎么修好它的?

简化示例

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/angularapp")
         .IncludeDirectory("~/AngularApp", "*.js", true));
}  

文件夹

  • AngularApp
    • 下一个文件夹
      • 包含 SuperLongNameOfFileToTellMeWhatItDoes.js -- 不起作用
      • 包含 ShortName.js -- 似乎可以工作

显然,我的项目包含比这更多的文件和更深的文件结构。但我正在尝试从将每个 .js 文件显式包含在一个非常大的 .Include 块中过渡到 .IncludeDirectory

【问题讨论】:

  • 多长,确切地说(完整路径)。我刚刚尝试了一个具有 190 个字符的文件名的基础项目并且它有效。话虽这么说,这可能是一个完整的路径长度限制(我敢猜测大约 255 个字符)......我添加了多个子文件夹,并且相同的文件名甚至未能成功保存......所以,重命名你的文件。 :)
  • 文件名肯定不是 190 个字符长,所以我猜这个假设是错误的。如果该行为再次发生,我会更新问题。

标签: asp.net visual-studio single-page-application asp.net-optimization


【解决方案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 文件,并且没有空目录,名称中除了下划线之外也没有奇怪的字符。

我使用不带 searchSubdirectories 参数的 .IncludeDirectory sintax 解决了问题,调用了每个子目录。

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\Scripts for myapp\Angular\controllers”。 失败的常见原因包括: - 文件名不是有效的 Win32 文件名。 - 文件名不是绝对路径。 - 文件名包含通配符。 - 指定的文件是一个目录。 - 访问被拒绝。

在我的情况下,这些原因似乎都不成立,我可以使用没有“子文件夹搜索”的方法注册子文件夹的内容。 (提示。要再次触发 Application_Start,只需在 web.config 中添加/删除一个空行。)

请注意,此异常不会阻塞 ASP 引擎,在我的情况下,页面是在浏览器中呈现的,您只是看不到错误。我注意到它是因为在 Application_Start 中我做了其他操作并且它们没有被执行。

我不知道错误的真正原因,但这是您可以找到它的方法以及对我有用的解决方法。

提示。要排除 Jasmine 测试文件,我使用它(在其他命令之后): bundles.IgnoreList.Ignore("*_jasmine.js", OptimizationMode.Always);

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 2011-09-28
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 2013-01-27
    • 2019-01-28
    • 2011-10-15
    相关资源
    最近更新 更多