Verzeichnis existiert nicht. Parametername: directoryVirtualPath


115

Ich habe gerade mein Projekt auf meinem Host auf Arvixe veröffentlicht und erhalte diesen Fehler (funktioniert gut lokal):

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

Was heißt das ?

Antworten:


229

Ich hatte das gleiche Problem und fand heraus, dass ich einige Bundles hatte, die auf nicht vorhandene Dateien mit {version} und * Platzhaltern wie z

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

Ich habe alle entfernt und der Fehler ist verschwunden.


2
Nicht sicher, wie dies "erstaunlich dunkel" oder schwer zu finden ist; Der Stacktrace zeigt Sie direkt auf den BundleConfig.RegisterBundlesAnruf von Application_StartMy +1 und geht stattdessen zur Antwort von @ user2465004.
CrazyPyro

3
Ich habe den gleichen Fehler erhalten, weil der in meinen Bundles genannte Ordner / scripts / auf meinem Server nicht vorhanden war.
user1616625

Ich habe ein asp.net mvc-Projekt in eine Web-API konvertiert und hatte wirklich keine Verwendung von JQuery- und CSS-Dateien. Ich bin froh, dass ich deinen Beitrag gefunden habe. Es wurde behoben und alles funktioniert gut.
Sam

3
Darüber hinaus scheinen Sie beim Veröffentlichen in Azure keine leeren Ordner veröffentlichen zu können. Ich hatte eine .IncludeDirectory-Anweisung ("~ / Scripts / Create / Controllers", "* .js"), und obwohl der Controller-Ordner tatsächlich vorhanden war, war noch nichts darin enthalten, und dies verursachte den gleichen Fehler. Ich habe gerade eine leere Textdatei in den Ordner gelegt, und dann hat es funktioniert.
RamblerToning

Dies passierte mir, als ich leere Verzeichnisse in meiner Bundle-Konfiguration hatte, zu denen ich in Zukunft Dateien hinzufügen wollte. Vor Ort war alles in Ordnung, da diese Verzeichnisse vorhanden waren, aber als ich zu Azure wechselte, wurden sie nicht erstellt
JMK

16

Ich hatte das gleiche Problem und es war kein Codeproblem. Ich habe die Veröffentlichungsoption verwendet (nicht die FTP-Option) und Visual Studio hat einige meiner Skripte / CSS nicht auf den Azure-Server hochgeladen, da sie nicht "in meinem Projekt enthalten" waren. Lokal funktionierte es also einwandfrei, da sich Dateien auf meiner Festplatte befanden. In meinem Fall wurde dieses Problem durch "Projekt> Alle Dateien anzeigen ..." gelöst. Klicken Sie mit der rechten Maustaste auf die nicht enthaltenen Dateien, fügen Sie sie ein und veröffentlichen Sie sie erneut


+1 Dies ist eine viel bessere Antwort als die akzeptierte und sollte möglicherweise darin zusammengeführt werden. Da die erste logische Antwort auf eine "Datei / Verzeichnis nicht gefunden" bereits darin besteht, zu überprüfen, ob sie vorhanden ist. Aber in dieser Situation ist es etwas hinterhältiger, weil Sie überprüfen, ob es lokal vorhanden ist, nur nicht auf dem Server. Für eine noch seltsamere Situation siehe meine Antwort.
CrazyPyro

Ich hatte auch dieses Problem. Die Bereitstellung von meiner lokalen Box aus funktionierte, vom Build-Server jedoch nicht. Es stellte sich heraus, dass der Build-Server die vom TypeScript-Compiler generierten .js-Dateien nicht in das Paket aufgenommen hat. Wahrscheinlich eine ältere Version der TypeScript-Tools auf dem Build-Server. Als schnelle Lösung habe ich die .js-Dateien in das Projekt aufgenommen.
Stimms

Für mich war es ein Problem mit BitTorrent Sync, das zum Bereitstellen von Dateien verwendet wurde. Einige Dateien wurden aufgrund eines Fehlers einfach nicht bereitgestellt.
Filip

10

Hier ist eine kurze Klasse, die ich geschrieben habe, um dies zu vereinfachen.

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

Um es zu verwenden, ersetzen Sie einfach ScriptBundle durch BundleRelaxed in Ihrem Code, wie in:

        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
Tolles Beispiel - nur Gotcha hier ist, dass Erweiterungen, die Sie möglicherweise verwenden , HostingEnvironment.MapPathnicht berücksichtigt BundleTable.VirtualPathProviderwerden ( möglicherweise nicht standardmäßig und nichtHostingEnvironment.VirtualPathProvider ). In diesem Fall möchten Sie das obige Beispiel in BundleTable.VirtualPathProvider.DirectoryExistsund konvertieren BundleTable.VirtualPathProvider.GetDirectory. Die Suche nach Dateimustern wird etwas problematischer, aber ein guter Ausgangspunkt.
SliverNinja - MSFT

Dies hat das Problem für mich behoben. Ich habe immer noch nicht herausgefunden, wer das beleidigende Bundle ist. Vielen Dank für dieses leistungsstarke Codebeispiel. Sie haben mich heute Nachmittag vor weiteren Problemen bewahrt.
Don Rolling

3

Ich bin heute auf dasselbe Problem gestoßen. Tatsächlich habe ich festgestellt, dass einige Dateien unter ~ / Scripts nicht veröffentlicht wurden. Das Problem ist behoben, nachdem ich die fehlenden Dateien veröffentlicht habe


2

Ich habe diesen Fehler auch dadurch erhalten, dass meine Datei bundles.config nicht vorhandene Verzeichnisse enthält. Ändern Sie dies:

<?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>

Dazu:

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

Löse das Problem für mich.


2

Wie bei @JerSchneid bestand mein Problem in leeren Verzeichnissen, aber mein Bereitstellungsprozess unterschied sich vom OP. Ich habe eine git-basierte Bereitstellung auf Azure (das Kudu verwendet) durchgeführt und nicht bemerkt, dass git keine leeren Verzeichnisse im Repo enthält. Sehen https://stackoverflow.com/a/115992/1876622

Meine lokale Ordnerstruktur war also:

[Project Root] / Content / jquery-plugins // hatte Dateien

[Project Root] / Scripts / jquery-plugins // hatte Dateien

[Project Root] / Scripts / Sonstige Plugins // leerer Ordner

Während beim Klonen / Ziehen meines Repositorys auf dem Remote-Server das leere Verzeichnis nicht angezeigt wurde:

[Project Root] / Content / jquery-plugins // hatte Dateien

[Project Root] / Scripts / jquery-plugins // hatte Dateien

Der beste Ansatz, um dies zu beheben, besteht darin, eine .keep-Datei im leeren Verzeichnis zu erstellen. Siehe diese SO-Lösung: https://stackoverflow.com/a/21422128/1876622


2

Ich hatte das gleiche Problem. Das Problem in meinem Fall war, dass sich der Ordner des Skripts mit allen Bootstrap / JQueries-Skripten nicht im Ordner wwwroot befand. Nachdem ich den Ordner des Skripts zu wwwroot hinzugefügt hatte, verschwand der Fehler.


1

Dies kann auch durch eine Racebedingung während der Bereitstellung verursacht werden:

Wenn Sie "Veröffentlichen" von Visual Studio zum Bereitstellen über eine Netzwerkdateifreigabe verwenden und "Alle vorhandenen Dateien vor dem Veröffentlichen löschen" aktivieren. (Ich mache das manchmal, um sicherzustellen, dass wir nicht unwissentlich immer noch von Dateien abhängig sind, die aus dem Projekt entfernt wurden, aber immer noch auf dem Server hängen.)

Wenn jemand die Site besucht, bevor alle erforderlichen JS / CSS-Dateien erneut bereitgestellt wurden, wird sie gestartet Application_Startund RegisterBundlesdie Bundles können nicht ordnungsgemäß erstellt und diese Ausnahme ausgelöst werden.

Aber bis Sie diese Ausnahme erhalten und den Server überprüfen, sind alle erforderlichen Dateien genau dort, wo sie sein sollten!

Die Anwendung bedient die Site jedoch weiterhin gerne und generiert 404 für jede Bundle-Anforderung sowie die daraus resultierenden nicht gestalteten / nicht funktionierenden Seiten. Sie versucht auch dann nicht, die Bundles neu zu erstellen, wenn die erforderlichen JS / CSS-Dateien jetzt verfügbar sind.

Bei einer erneuten Bereitstellung mit "Übereinstimmende Dateien durch lokale Kopien ersetzen" wird die App dieses Mal neu gestartet und die Bundles ordnungsgemäß registriert.


1

Dies kann ein altes Problem sein. Ich habe einen ähnlichen Fehler und in meinem Fall war es der Skriptordner, der in meinem Modellordner versteckt war. Die Stapelverfolgung gibt eindeutig an, dass das Verzeichnis fehlt, und standardmäßig sollten sich alle Java-Skripte im Skriptordner befinden. Dies gilt möglicherweise nicht für die oben genannten Benutzer.


1

Ich hatte eine neue AngularAnwendung erstellt und geschrieben

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

Ich hatte jedoch no erstellt services, sodass der servicesOrdner beim Veröffentlichen nicht bereitgestellt wurde, da er leer war. Leider müssen Sie eine Dummy-Datei in einen leeren Ordner legen, damit sie veröffentlicht werden kann

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

Auch ich stand vor dem gleichen Problem. Durchsuchte den Dateipfad unter Skriptordner. Kopierte den genauen Dateinamen und nahm Änderungen in bundle.cs vor:

Alter Code: //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-*"));

    }
}

Neuer Code :

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

Ich hatte dieses Problem, als ich ein VS2017-Projekt in VS2015 öffnete, die Lösung erstellte und dann die DLLs hochlud.

Das Problem wurde behoben, indem es in VS2017 neu erstellt und die DLLs erneut hochgeladen wurden.


0

Ich habe die gleiche Frage! Es scheint mit IIS Express. Ich ändere die URL von IIS Express für Project Like:

"http://localhost:3555/"

dann ist das problem weg.


0

Mein Problem war, dass meine Site keine zu bündelnden Dateien hatte. Ich hatte die Site jedoch mit einer MVC-Vorlage erstellt, die jQuery-Skripte enthält. Die bundle.config verwies auf diese Dateien und ihre Ordner. Ich brauchte die Skripte nicht und löschte sie. Nach dem Bearbeiten der bundle.config war alles in Ordnung.


0

Alles funktionierte einwandfrei, während beim Vornehmen nicht verwandter Änderungen und beim nächsten Build das gleiche Problem auftrat. Verwendete die Quellcodeverwaltung, um sie mit früheren Versionen zu vergleichen, und stellte fest, dass mein Ordner ../Content/Scripts auf mysteriöse Weise geleert wurde!

Wiederhergestellt ../Content/Scripts/*.*von einem Backup und alles hat gut funktioniert!

ps: Mit VS2012 hatte MVC4 kürzlich einige NuGet-Pakete aktualisiert, sodass dies möglicherweise eine Rolle bei dem Problem gespielt hat, aber nach dem Update lief alles eine Weile gut, daher nicht sicher.


0

Suchen Sie in Ihrer BundleConfig.cs-Datei nach den Zeilen, die IncludeDirectory () aufrufen.

dh:

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

Mein Grid-Verzeichnis existierte nicht.


0

Ich hatte auch diesen Fehler, als ich alle meine getrennten Bündel zu einem Bündel kombinierte.

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

Gewechselt zu

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

Ich musste den Anwendungspool im Control Panel meines Shared Hosting aktualisieren, um dieses Problem zu beheben.


0

Das Entfernen dieser Codezeilen aus der Klassendatei bundleConfig.cs löste meine Herausforderung:

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

0

Keine dieser Antworten hat mir geholfen, da ich meine jsxDateien auf seltsame Weise erstellt habe. Mein Code funktionierte im localhost-Modus, schlug jedoch in der Produktion fehl.

Die Lösung für mich bestand darin, in die csprojDatei zu gehen und die Dateipfade von <None ...nach zu ändern<Content ...


0

Grundsätzlich gibt Ihnen die Stapelverfolgung genau den Ort (wie im Screenshot hervorgehoben), an dem Sie nicht vorhandene Ressourcen entfernen müssen.

Bild zeigt Stapelspur

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.