Le répertoire n'existe pas. Nom du paramètre: directoryVirtualPath

115

Je viens de publier mon projet sur mon hôte sur Arvixe et j'obtiens cette erreur (fonctionne bien en local):

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

Qu'est-ce que ça veut dire ?

BjarkeCK
la source

Réponses:

229

J'ai eu le même problème et j'ai découvert que j'avais des bundles qui pointaient vers des fichiers non existants en utilisant {version} et * des caractères génériques tels que

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

J'ai supprimé tout cela et l'erreur est partie.

Martin Ørding-Thomsen
la source
2
Je ne sais pas comment cela est "incroyablement obscur" ou difficile à trouver; le stacktrace vous dirige directement vers l' BundleConfig.RegisterBundlesappel de Application_StartMon +1 va à la réponse de @ user2465004 à la place.
CrazyPyro
3
J'ai reçu la même erreur car le dossier / scripts / référencé dans mes bundles n'existait pas sur mon serveur.
user1616625
J'ai converti un projet mvc asp.net en API Web et je n'avais vraiment aucune utilisation de jquery, de fichiers css. Heureux d'avoir trouvé votre message. Corrigé et tout fonctionne bien.
Sam
3
De plus, lors de la publication sur Azure, il ne semble pas vous permettre de publier des dossiers vides. J'avais une instruction .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js"), et bien que le dossier Controllers existait bel et bien, il ne contenait encore rien et cela a causé la même erreur. Je viens de mettre un fichier texte vide dans le dossier, puis cela a fonctionné.
RamblerToning
Cela m'est arrivé quand j'avais des répertoires vides inclus dans ma configuration de bundle, auxquels j'avais prévu d'ajouter des fichiers à l'avenir. Tout allait bien localement parce que ces répertoires existaient, mais quand j'ai poussé vers Azure, ils n'ont pas été créés,
JMK
16

J'ai eu ce même problème et ce n'était pas un problème de code. J'utilisais l'option de publication (pas celle FTP) et Visual Studio ne téléchargeait pas certains de mes scripts / css sur le serveur azure car ils n'étaient pas "inclus dans mon projet". Donc, localement, cela fonctionnait très bien, car les fichiers étaient là sur mon disque dur. Ce qui a résolu ce problème dans mon cas était "Projet> Afficher tous les fichiers ..." et faites un clic droit sur ceux qui n'étaient pas inclus, incluez-les et publiez à nouveau

dsnunez
la source
+1 C'est une bien meilleure réponse que celle acceptée, et devrait peut-être y être fusionnée. Puisque la première chose logique à faire en réponse à un "fichier / répertoire non trouvé" est déjà d'aller vérifier qu'il existe. Mais dans cette situation, c'est un peu plus sournois, car vous vérifiez et il existe localement, mais pas sur le serveur. Pour une situation encore plus étrange, voyez ma réponse.
CrazyPyro
J'ai aussi eu ce problème. Le déploiement à partir de ma boîte locale a fonctionné mais à partir du serveur de construction, ce n'est pas le cas. Il s'est avéré que le serveur de build n'incluait pas les fichiers .js générés par le compilateur TypeScript dans le package. Probablement une version plus ancienne des outils TypeScript sur le serveur de construction. En guise de solution rapide, j'ai inclus les fichiers .js dans le projet.
stimms
Pour moi, c'était un problème avec BitTorrent Sync utilisé pour déployer des fichiers. Certains fichiers n'ont tout simplement pas été déployés en raison d'un problème.
Filip
10

Voici un cours rapide que j'ai écrit pour rendre cela plus facile.

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

Pour l'utiliser, remplacez simplement ScriptBundle par BundleRelaxed dans votre code, comme dans:

        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")
            );
Barnabas Kendall
la source
2
Excellent exemple - le seul inconvénient est que HostingEnvironment.MapPathcela ne prend pas en compte les BundleTable.VirtualPathProviderextensions que vous utilisez peut-êtreHostingEnvironment.VirtualPathProvider ( peuvent être non par défaut et non ). Dans ce cas, vous voudrez convertir l'exemple ci-dessus pour utiliser BundleTable.VirtualPathProvider.DirectoryExistset BundleTable.VirtualPathProvider.GetDirectory. Les recherches de modèles de fichiers deviennent un peu plus problématiques, mais c'est un bon point de départ.
SliverNinja - MSFT
Cela a résolu le problème pour moi. Je n'ai toujours pas compris qui est le lot incriminé. Merci pour cet exemple de code puissant, vous m'avez sauvé d'une aggravation supplémentaire cet après-midi.
Don Rolling
3

J'ai rencontré le même problème aujourd'hui, c'est en fait que j'ai trouvé que certains fichiers sous ~ / Scripts ne sont pas publiés. Le problème est résolu après la publication des fichiers manquants

Naga
la source
2

J'ai également eu cette erreur en ayant des répertoires inexistants dans mon fichier bundles.config. Changer cela:

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

Pour ça:

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

Résolvez le problème pour moi.

JerSchneid
la source
2

Comme @JerSchneid, mon problème était les répertoires vides, mais mon processus de déploiement était différent de l'OP. Je faisais un déploiement basé sur git sur Azure (qui utilise Kudu) et je ne savais pas que git n'incluait pas les répertoires vides dans le dépôt. Voir https://stackoverflow.com/a/115992/1876622

Donc, ma structure de dossiers locaux était:

[Project Root] / Content / jquery-plugins // avait des fichiers

[Racine du projet] / Scripts / jquery-plugins // avait des fichiers

[Project Root] / Scripts / misc-plugins // dossier vide

Alors que tout clone / pull de mon référentiel sur le serveur distant ne recevait pas ledit répertoire vide:

[Project Root] / Content / jquery-plugins // avait des fichiers

[Racine du projet] / Scripts / jquery-plugins // avait des fichiers

La meilleure approche pour résoudre ce problème est de créer un fichier .keep dans le répertoire vide. Voir cette solution SO: https://stackoverflow.com/a/21422128/1876622

HeyZiko
la source
2

J'ai eu le même problème. le problème dans mon cas était que le dossier du script avec tous les scripts bootstrap / jqueries n'était pas dans le dossier wwwroot. une fois que j'ai ajouté le dossier du script à wwwroot, l'erreur a disparu.

rafaelzm2000
la source
1

Cela peut également être causé par une condition de concurrence lors du déploiement:

Si vous utilisez «Publier» de Visual Studio pour déployer sur un partage de fichiers réseau et cochez «Supprimer tous les fichiers existants avant la publication». (Je fais cela parfois pour m'assurer que nous ne dépendons pas encore sans le savoir des fichiers qui ont été supprimés du projet mais qui traînent toujours sur le serveur.)

Si quelqu'un accède au site avant que tous les fichiers JS / CSS requis soient redéployés, il démarre Application_Startet RegisterBundlesne parvient pas à construire correctement les bundles et à lever cette exception.

Mais au moment où vous obtenez cette exception et allez vérifier le serveur, tous les fichiers nécessaires sont exactement là où ils devraient être!

Cependant, l'application continue joyeusement de servir le site, générant des 404 pour toute demande de bundle, ainsi que les pages non stylisées / non fonctionnelles qui en résultent, et n'essaye jamais de reconstruire les bundles même après que les fichiers JS / CSS nécessaires soient maintenant disponibles.

Un redéploiement à l'aide de «Remplacer les fichiers correspondants par des copies locales» déclenchera le redémarrage de l'application et enregistrera correctement les ensembles cette fois.

CrazyPyro
la source
1

Cela peut être un vieux problème.J'ai une erreur similaire et dans mon cas, c'était le dossier Scripts qui se cachait dans mon dossier Modèles. La trace de la pile indique clairement son répertoire manquant et, par défaut, tous les scripts Java doivent se trouver dans le dossier Scripts. Cela peut ne pas s'appliquer aux utilisateurs ci-dessus.

CurieuxRK
la source
1

J'avais créé une nouvelle Angularapplication et écrit

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

mais j'avais créé non services, donc le servicesdossier n'a pas été déployé lors de la publication car il était vide. Malheureusement, vous devez mettre un fichier factice dans un dossier vide pour qu'il puisse être publié

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

tic
la source
1

Moi aussi, j'ai été confronté au même problème. Navigué vers le chemin du fichier sous Script Folder.Copier le nom exact du fichier et apporter des modifications dans bundle.cs:

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

    }
}

Nouveau 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"));
      }
}
Adityan s nair
la source
1

J'ai eu ce problème lorsque j'ai ouvert un projet VS2017 dans VS2015, créé la solution, puis téléchargé les DLL.

La reconstruction dans VS2017 et le re-téléchargement des DLL ont résolu le problème.

Steve Woods
la source
0

J'ai la même question! Il semble avec IIS Express. Je change l'URL d'IIS Express pour le projet comme:

"http://localhost:3555/"

puis le problème est parti.

utilisateur2320546
la source
0

Mon problème était que mon site n'avait aucun fichier à regrouper. Cependant, j'avais créé le site avec un modèle MVC, qui comprend des scripts jQuery. Le bundle.config faisait référence à ces fichiers et à leurs dossiers. N'ayant pas besoin des scripts, je les ai supprimés. Après avoir édité le bundle.config, tout allait bien.

CraigP
la source
0

Tout fonctionnait bien, puis lors de modifications non liées et lors de la prochaine version, le même problème a été rencontré. J'ai utilisé le contrôle de code source pour comparer aux versions précédentes et j'ai découvert que mon dossier ../Content/Scripts avait mystérieusement été vidé!

Restauré ../Content/Scripts/*.* à partir d'une sauvegarde et tout a bien fonctionné!

ps: L'utilisation de VS2012, MVC4, avait récemment mis à jour certains packages NuGet, ce qui aurait pu jouer un rôle dans le problème, mais tout fonctionnait bien pendant un certain temps après la mise à jour, donc pas sûr.

nspire
la source
0

recherchez dans votre fichier BundleConfig.cs les lignes qui invoquent IncludeDirectory ()

c'est à dire:

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

mon répertoire Grid n'existait pas.

RolandoCC
la source
0

J'ai également eu cette erreur lorsque j'ai combiné tous mes paquets séparés en un seul paquet.

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

Changé en

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

J'ai dû actualiser le pool d'applications sur le panneau de configuration de mon hébergement partagé pour résoudre ce problème.

rene anderson
la source
0

La suppression de ces lignes de code du fichier de classe bundleConfig.cs a résolu mon problème:

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

Aucune de ces réponses ne m'a aidé puisque j'ai créé mes jsxfichiers de manière étrange. Mon code fonctionnait en mode localhost mais a échoué en production.

Le correctif pour moi était d'aller dans le csprojfichier et de changer les chemins de fichier de <None ...à<Content ...

JacobIRR
la source
0

Fondamentalement, la trace de pile vous donne l'emplacement exact (comme indiqué dans la capture d'écran) dont vous avez besoin pour supprimer la ressource non existante.

image montrant la trace de la pile

Sandeep talabathula
la source