119 votes

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

Je viens de publier mon projet sur mon hôte sur Arvixe et je reçois cette erreur (qui 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 cela signifie ?

0 votes

Veuillez vérifier si vous avez téléchargé le dossier des scripts sur le serveur.

235voto

J'ai eu le même problème et j'ai découvert que certains paquets pointaient vers des fichiers inexistants en utilisant les caractères génériques {version} et *, par exemple

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

J'ai supprimé tous ces éléments et l'erreur a disparu.

2 votes

Je ne vois pas en quoi c'est "étonnamment obscur" ou difficile à trouver ; le suivi de pile vous dirige directement vers la fonction BundleConfig.RegisterBundles appel de Application_Start Mon +1 va à la réponse de @user2465004 à la place.

3 votes

J'ai reçu la même erreur car le dossier /scripts/ mentionné dans mes bundles n'existe pas sur mon serveur.

0 votes

J'ai converti un projet asp.net mvc en api web et je n'avais vraiment pas besoin de fichiers jquery, css. Je suis content d'avoir trouvé votre article. Je l'ai corrigé et tout fonctionne bien.

16voto

dsnunez Points 430

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

0 votes

+1 C'est une bien meilleure réponse que celle qui a été acceptée, et elle devrait peut-être être fusionnée avec celle-ci. 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 bizarre, voir ma réponse.

0 votes

J'ai également rencontré ce problème. Le déploiement à partir de ma boîte locale a fonctionné, mais pas à partir du serveur de construction. Il s'est avéré que le serveur de compilation n'incluait pas les fichiers .js générés par le compilateur TypeScript dans le paquet. Probablement une ancienne version des outils TypeScript sur le serveur de compilation. Comme solution rapide, j'ai inclus les fichiers .js dans le projet.

0 votes

Pour moi, c'était un problème avec BitTorrent Sync utilisé pour déployer les fichiers. Certains fichiers n'étaient tout simplement pas déployés en raison d'un pépin

10voto

Barnabas Kendall Points 2184

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, il suffit de remplacer 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")
            );

2 votes

Bon exemple - le seul problème ici est que HostingEnvironment.MapPath ne prend pas en considération BundleTable.VirtualPathProvider que vous utilisez peut-être ( peut ne pas être par défaut et ne pas être HostingEnvironment.VirtualPathProvider ). Dans ce cas, vous voudriez convertir l'exemple ci-dessus pour utiliser BundleTable.VirtualPathProvider.DirectoryExists y BundleTable.VirtualPathProvider.GetDirectory . Modèle de fichier Les recherches deviennent un peu plus problématiques, mais c'est un bon point de départ.

0 votes

Cela a réglé le problème pour moi. Je n'ai toujours pas trouvé qui est le paquet en question. Merci pour ce puissant exemple de code, vous m'avez évité une nouvelle aggravation cet après-midi.

2voto

HeyZiko Points 31

Comme @JerSchneid, mon problème était des répertoires vides, mais mon processus de déploiement était différent de celui du PO. Je faisais un déploiement basé sur git sur Azure (qui utilise Kudu), et je n'ai pas réalisé que git n'inclut pas les répertoires vides dans le repo. Voir https://stackoverflow.com/a/115992/1876622

La structure de mon dossier local était donc la suivante :

[Racine du projet]/Content/jquery-plugins // a des fichiers

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

[Racine du projet]/Scripts/misc-plugins // dossier vide

Alors que tout clone/tirage de mon référentiel sur le serveur distant n'obtenait pas ce répertoire vide :

[Racine du projet]/Content/jquery-plugins // a des fichiers

[Racine du projet]/Scripts/jquery-plugins // a 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

2voto

JerSchneid Points 3167

J'ai également obtenu cette erreur en ayant des répertoires inexistants dans mon fichier bundles.config. En changeant ceci :

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

A ceci :

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

Résolvez le problème pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X