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

时间:2012-07-03 18:58:34

标签: c# asp.net-mvc iis asp.net-mvc-4

我刚刚在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

这是什么意思?

20 个答案:

答案 0 :(得分:219)

我遇到了同样的问题,发现我有一些使用{version}和*通配符(例如

)指向不存在的文件的包
bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
    "~/Scripts/jquery-{version}.js"));

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

答案 1 :(得分:16)

我遇到了同样的问题而且这不是代码问题。 我使用的是发布选项(不是FTP版本),Visual Studio没有将我的一些脚本/ css上传到azure服务器,因为它们没有“包含在我的项目中”。 所以,在本地它工作得很好,因为文件存在于我的硬盘中。 在我的案例中解决这个问题的是“项目>显示所有文件...”并右键单击未包含的文件,包括它们并再次发布

答案 2 :(得分:8)

这是我写的一个快速课程,以使这更容易。

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);
    }
}

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

        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")
            );

答案 3 :(得分:3)

今天我遇到了同样的问题,实际上我发现〜/ Scripts下的一些文件没有发布。我发布了丢失的文件

后问题得以解决

答案 4 :(得分: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>

为我解决问题。

答案 5 :(得分:2)

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

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

  

[Project Root] / Content / jquery-plugins //有文件

     

[Project Root] / Scripts / jquery-plugins //有文件

     

[Project Root] / Scripts / misc-plugins //空文件夹

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

  

[Project Root] / Content / jquery-plugins //有文件

     

[Project Root] / Scripts / jquery-plugins //有文件

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

这也可能是由部署时的竞争条件引起的:

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

如果有人在重新部署所有必需的JS / CSS文件之前访问该站点,它将启动Application_StartRegisterBundles,这将无法正确构建捆绑包并抛出此异常。

但是当你得到这个例外并去检查服务器时,所有必要的文件都在它们应该的位置!

然而,该应用程序很高兴继续为该站点提供服务,为任何捆绑请求生成404,以及由此产生的无样式/无功能页面,并且即使在现在必要的JS / CSS文件之后也永远不会尝试重建捆绑包可用。

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

答案 8 :(得分:1)

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

答案 9 :(得分: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"));

但我没有创建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/

答案 10 :(得分:1)

我也遇到了同样的问题。浏览到Script Folder下的文件路径。复制确切的文件名并在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"));
      }
}

答案 11 :(得分:0)

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

image showing stack trace

答案 12 :(得分:0)

运行您的应用程序的文件丢失。尝试构建并重新上传您的项目。或者,如果您有备份,请尝试从备份中返回。将解决问题

答案 13 :(得分:0)

这些答案都没有帮助我,因为我以奇怪的方式创建了jsx文件。我的代码在localhost模式下工作,但在生产中失败。

我的解决方法是进入csproj文件并将文件路径从<None ...更改为<Content ...

答案 14 :(得分:0)

从bundleConfig.cs类文件中删除这行代码解决了我的挑战:

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

答案 15 :(得分: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"));

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

答案 16 :(得分:0)

查看BundleConfig.cs文件,查看调用 IncludeDirectory()

的行

即:

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

我的网格目录不存在。

答案 17 :(得分:0)

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

从备份中恢复了../Content/Scripts/*.*,一切运作良好!

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

我有同样的问题! 它似乎与IIS Express。我更改项目的IIS Express的URL:

"http://localhost:3555/"
然后问题就消失了。