目录不存在。参数名称:directoryVirtualPath


115

我刚刚将项目发布到Arvixe上的主机上,并收到此错误(在本地工作正常):

Server Error in '/' Application.

Directory does not exist.
Parameter name: directoryVirtualPath

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentException: Directory does not exist.
Parameter name: directoryVirtualPath

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[ArgumentException: Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.Optimization.Bundle.IncludeDirectory(String directoryVirtualPath, String searchPattern, Boolean searchSubdirectories) +357
   System.Web.Optimization.Bundle.Include(String[] virtualPaths) +287
   IconBench.BundleConfig.RegisterBundles(BundleCollection bundles) +75
   IconBench.MvcApplication.Application_Start() +128

[HttpException (0x80004005): Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +9160125
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +131
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +194
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +339
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +253

[HttpException (0x80004005): Directory does not exist.
Parameter name: directoryVirtualPath]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9079228
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +97
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +256

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.237

这是什么意思 ?

Answers:


229

我遇到了同样的问题,发现我有一些捆绑包指向使用{version}和*通配符的不存在的文件,例如

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    "~/Scripts/jquery-{version}.js"));

我删除了所有这些,错误消失了。


2
不知道这是如何“难以理解”或很难找到的;您直接BundleConfig.RegisterBundlesApplication_StartMy +1 调用的stacktrace指向@ user2465004的答案。
CrazyPyro

3
我收到相同的错误,因为服务器中不存在捆绑软件中引用的/ scripts /文件夹。
user1616625 2014年

我将asp.net mvc项目转换为Web api,实际上没有使用jquery,css文件。很高兴我找到了您的帖子。修复它,一切正常。
2015年

3
除此之外,当发布到Azure时,似乎不允许您发布空文件夹。我有一个.IncludeDirectory(“〜/ Scripts / Create / Controllers”,“ * .js”)语句,虽然Controllers文件夹确实存在,但实际上还没有任何东西,这会导致相同的错误。我只是将空白文本文件放在文件夹中,然后就可以了。
RamblerToning 2015年

当我的捆绑包配置中包含空目录时,这发生在我身上,我计划将来将文件添加到其中。本地一切正常,因为这些目录存在,但是当我推送到Azure时,它们没有被创建,
JMK 2015年

16

我有同样的问题,这不是代码问题。我使用的是publish选项(而不是FTP),Visual Studio没有将我的一些脚本/ css上传到azure服务器,因为它们没有“包含在我的项目中”。因此,在本地工作正常,因为文件在我的硬盘中。在我的情况下,解决此问题的方法是“项目>显示所有文件...”,然后右键单击未包含的文件,包括它们并再次发布


+1这是一个比被接受的答案更好的答案,应该将其合并。由于响应“未找到文件/目录”要做的第一件事就是检查它是否存在。但是在这种情况下,这有点麻烦,因为您检查并且它确实存在于本地,而不是在服务器上。对于更奇怪的情况,请参阅我的答案。
CrazyPyro

我也有这个问题。从我的本地机器进行部署是可行的,但是没有从构建服务器进行部署。事实证明,构建服务器未在包中包括由TypeScript编译器生成的.js文件。可能是构建服务器上的TypeScript工具的较旧版本。作为快速解决方案,我在项目中包含了.js文件。
stimms 2014年

对我来说,这是用于部署文件的BitTorrent Sync的问题。某些文件根本就没有部署,由于一些故障..
菲利普

10

这是我写的一个快速课程,可以简化此过程。

using System.Web.Hosting;
using System.Web.Optimization;

// a more fault-tolerant bundle that doesn't blow up if the file isn't there
public class BundleRelaxed : Bundle
{
    public BundleRelaxed(string virtualPath)
        : base(virtualPath)
    {
    }

    public new BundleRelaxed IncludeDirectory(string directoryVirtualPath, string searchPattern, bool searchSubdirectories)
    {
        var truePath = HostingEnvironment.MapPath(directoryVirtualPath);
        if (truePath == null) return this;

        var dir = new System.IO.DirectoryInfo(truePath);
        if (!dir.Exists || dir.GetFiles(searchPattern).Length < 1) return this;

        base.IncludeDirectory(directoryVirtualPath, searchPattern);
        return this;
    }

    public new BundleRelaxed IncludeDirectory(string directoryVirtualPath, string searchPattern)
    {
        return IncludeDirectory(directoryVirtualPath, searchPattern, false);
    }
}

要使用它,只需在代码中用BundleRelaxed替换ScriptBundle,如下所示:

        bundles.Add(new BundleRelaxed("~/bundles/admin")
            .IncludeDirectory("~/Content/Admin", "*.js")
            .IncludeDirectory("~/Content/Admin/controllers", "*.js")
            .IncludeDirectory("~/Content/Admin/directives", "*.js")
            .IncludeDirectory("~/Content/Admin/services", "*.js")
            );

2
很好的例子-这里唯一的问题是HostingEnvironment.MapPath没有考虑BundleTable.VirtualPathProvider您可能使用的扩展名(可能不是默认值,而不是HostingEnvironment.VirtualPathProvider)。对于这种情况,您需要将上面的示例转换为使用BundleTable.VirtualPathProvider.DirectoryExistsBundleTable.VirtualPathProvider.GetDirectory文件模式搜索变得有些问题,但是是一个很好的起点。
SliverNinja-MSFT

这为我解决了这个问题。仍然没有弄清楚谁是令人讨厌的捆绑包。感谢您提供的强大代码示例,今天下午您使我免于进一步恶化。
唐·

3

今天我遇到了同样的问题,实际上我发现〜/ Scripts下的某些文件未发布。发布丢失的文件后,此问题已解决


2

我在bundles.config文件中有不存在的目录,也出现了此错误。改变这个:

<?xml version="1.0"?>
<bundleConfig ignoreIfDebug="true" ignoreIfLocal="true">
    <cssBundles>
        <add bundlePath="~/css/shared">
            <directories>
                <add directoryPath="~/content/" searchPattern="*.css"></add>
            </directories>
        </add>
    </cssBundles>
    <jsBundles>
        <add bundlePath="~/js/shared">
            <directories>
                <add directoryPath="~/scripts/" searchPattern="*.js"></add>
            </directories>
            <!--
            <files>
                <add filePath="~/scripts/jscript1.js"></add>
                <add filePath="~/scripts/jscript2.js"></add>
            </files>
            -->
        </add>
    </jsBundles>
</bundleConfig>

对此:

<?xml version="1.0"?>
<bundleConfig ignoreIfDebug="true" ignoreIfLocal="true">
    <cssBundles>
    </cssBundles>
    <jsBundles>
    </jsBundles>
</bundleConfig>

为我解决问题。


2

像@JerSchneid一样,我的问题是空目录,但是我的部署过程与OP不同。我在Azure(使用Kudu)上进行基于git的部署,但没有意识到git在存储库中不包含空目录。参见https://stackoverflow.com/a/115992/1876622

所以我的本地文件夹结构是:

[项目根目录] / Content / jquery-plugins //有文件

[项目根目录] /脚本/ jquery-plugins //有文件

[项目根目录] / Scripts / misc-plugins //空文件夹

远程服务器上我的存储库的任何克隆/提取都没有得到空目录:

[项目根目录] / Content / jquery-plugins //有文件

[项目根目录] /脚本/ jquery-plugins //有文件

解决此问题的最佳方法是在空目录中创建一个.keep文件。查看此SO解决方案:https : //stackoverflow.com/a/21422128/1876622


2

我遇到过同样的问题。在我的情况下,问题是带有所有bootstrap / jqueries脚本的脚本文件夹不在wwwroot文件夹中。将脚本的文件夹添加到wwwroot后,错误消失了。


1

这也可能是由于部署时的竞争状况引起的:

如果您使用Visual Studio的“发布”在网络文件共享上进行部署,并选中“在发布之前删除所有现有文件”。(我有时这样做是为了确保我们不会在不知不觉中仍然依赖于已从项目中删除但仍在服务器上闲逛的文件。)

如果有人在重新部署所有必需的JS / CSS文件之前访问该网站,它将启动Application_StartRegisterBundles并且将无法正确构造分发包并引发此异常。

但是,当您收到此异常并检查服务器时,所有必需的文件都在正确的位置!

但是,应用程序很乐意继续为站点提供服务,为任何捆绑请求生成404,以及由此产生的未样式化/无效的页面,并且即使现在可用的必要JS / CSS文件可用,也永远不会尝试重建捆绑。

使用“用本地副本替换匹配的文件”重新部署将触发应用程序重新启动并正确注册捆绑软件。


1

这可能是一个旧问题。我有类似的错误,在我的情况下是Scripts文件夹隐藏在我的Models文件夹中。堆栈跟踪清楚地表明其缺少目录,默认情况下,所有Java脚本都应位于脚本文件夹中。这可能不适用于以上用户。


1

我创建了一个新的Angular应用程序并编写

bundles.Add(new ScriptBundle("~/bundles/app")
    .IncludeDirectory("~/Angular", "*.js")
    .IncludeDirectory("~/Angular/directives/shared", "*.js")
    .IncludeDirectory("~/Angular/directives/main", "*.js")
    .IncludeDirectory("~/Angular/services", "*.js"));

但是我没有创建no services,所以该services文件夹没有部署,因为它是空的。不幸的是,您必须将虚拟文件放入任何空文件夹中才能发布

https://blogs.msdn.microsoft.com/webdevelopertips/2010/04/29/tip-105-did-you-know-how-to-include-empty-directory-when-package-a-web-application/


1

我也面临同样的问题。浏览到脚本文件夹下的文件路径,复制确切的文件名并在bundle.cs中进行更改:

旧代码://Bundle.cs

public class BundleConfig

{

    public static void RegisterBundles(BundleCollection bundles)

    {

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate*"));

        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-*"));

    }
}

新代码:

public class BundleConfig

{

      public static void RegisterBundles(BundleCollection bundles)

      {

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-1.10.2.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate.js"));

        bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                    "~/Scripts/modernizr-2.6.2.js"));
      }
}

1

当我在VS2015中打开VS2017项目,构建解决方案并上传DLL时遇到了这个问题。

在VS2017中重建它并重新上传DLL解决了该问题。


0

我有同样的问题!似乎与IIS Express。我将IIS Express的URL更改为Project,例如:

"http://localhost:3555/"

然后问题就解决了。


0

我的问题是我的网站没有要捆绑的文件。但是,我使用MVC模板创建了该站点,该模板包括jQuery脚本。bundle.config引用了这些文件及其文件夹。不需要脚本,我删除了它们。编辑bundle.config之后,一切都很好。


0

一切工作正常,然后进行不相关的更改并在下一个版本中遇到了同一问题。使用源代码控制程序与以前的版本进行比较,发现我的../Content/Scripts文件夹被神秘清空了!

从备份中还原了../Content/Scripts/*.*,一切正常!

ps:使用VS2012,MVC4最近更新了一些NuGet软件包,因此这可能在问题中起到了一定作用,但是更新后的一段时间运行都很好,所以不确定。


0

在BundleConfig.cs文件中查找调用IncludeDirectory()的行

即:

  bundles.Add(new Bundle("~/bundle_js_angularGrid").IncludeDirectory(
                       "~/Scripts/Grid", "*.js", true));

我的网格目录不存在。


0

当我将所有分开的捆绑成一个捆绑时,我也遇到了这个错误。

bundles.Add(new ScriptBundle("~/bundles/one").Include(
            "~/Scripts/one.js"));
bundles.Add(new ScriptBundle("~/bundles/two").Include(
            "~/Scripts/two.js"));

变成

bundles.Add(new ScriptBundle("~/bundles/js").Include(
            "~/Scripts/one.js",
            "~/Scripts/two.js"));

我必须在共享主机的控制面板上刷新应用程序池才能解决此问题。


0

从bundleConfig.cs类文件中删除以下代码行解决了我的难题:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));

0

自从我jsx以怪异的方式创建文件以来,这些答案都无济于事。我的代码在localhost模式下工作,但在生产中失败。

对我来说,解决方法是进入csproj文件并将文件路径从更改<None ...<Content ...


0

基本上,堆栈跟踪为您提供了删除不存在的资源所需的确切位置(如屏幕快照中突出显示)。

该图显示了堆栈跟踪

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.