El directorio no existe. Nombre del parámetro: directoryVirtualPath

115

Acabo de publicar mi proyecto en mi host en Arvixe y obtengo este error (funciona bien localmente):

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é significa eso ?

BjarkeCK
fuente

Respuestas:

229

Tuve el mismo problema y descubrí que tenía algunos paquetes que apuntaban a archivos no existentes que usaban {versión} y * comodines como

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

Eliminé todos esos y el error desapareció.

Martin Ørding-Thomsen
fuente
2
No estoy seguro de cómo esto es "sorprendentemente oscuro" o difícil de encontrar; el stacktrace le apunta directamente a la BundleConfig.RegisterBundlesllamada de Application_StartMy +1 que va a la respuesta de @ user2465004.
CrazyPyro
3
Recibí el mismo error porque la carpeta / scripts / mencionada en mis paquetes no existía en mi servidor.
user1616625
Convertí un proyecto asp.net mvc a web api y realmente no usé jquery, archivos css. Me alegro de haber encontrado tu publicación. Se arregló y todo funciona bien.
Sam
3
Además de esto, al publicar en Azure, no parece permitirle publicar carpetas vacías. Tenía una instrucción .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js"), y aunque la carpeta Controllers sí existía, todavía no tenía nada y esto causó el mismo error. Simplemente puse un archivo de texto en blanco en la carpeta y funcionó.
RamblerToning
Esto me sucedió cuando tenía directorios vacíos incluidos en la configuración de mi paquete, a los que planeaba agregar archivos en el futuro. Todo estaba bien localmente porque esos directorios existían, pero cuando empujé a Azure, no se crearon,
JMK
16

Tuve este mismo problema y no fue un problema de código. Estaba usando la opción de publicación (no la de FTP) y Visual Studio no cargaba algunos de mis scripts / css en el servidor azure porque no estaban "incluidos en mi proyecto". Entonces, localmente funcionó bien, porque los archivos estaban allí en mi disco duro. Lo que solucionó este problema en mi caso fue "Proyecto> Mostrar todos los archivos ..." y hacer clic derecho en los que no estaban incluidos, incluirlos y volver a publicar

dsnunez
fuente
+1 Esta es una respuesta mucho mejor que la aceptada, y tal vez debería fusionarse con ella. Dado que lo primero que se debe hacer en respuesta a un "archivo / directorio no encontrado" es comprobar que existe. Pero en esta situación es un poco más furtivo, porque verificas y existe localmente, pero no en el servidor. Para una situación aún más extraña, vea mi respuesta.
CrazyPyro
También tuve este problema. La implementación desde mi caja local funcionó, pero desde el servidor de compilación no funcionó. Resultó ser que el servidor de compilación no incluía los archivos .js generados por el compilador de TypeScript en el paquete. Probablemente una versión anterior de las herramientas de TypeScript en el servidor de compilación. Como solución rápida, incluí los archivos .js en el proyecto.
estimula el
Para mí fue un problema con BitTorrent Sync utilizado para implementar archivos. Algunos archivos simplemente no se implementaron debido a un problema técnico.
Filip
10

Aquí hay una clase rápida que escribí para facilitar esto.

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

Para usarlo, simplemente reemplace ScriptBundle con BundleRelaxed en su código, como en:

        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
fuente
2
Gran ejemplo: lo único que tengo aquí es que HostingEnvironment.MapPathno tiene en cuenta las BundleTable.VirtualPathProviderextensiones que puede estar usando ( puede que no sean las predeterminadas o noHostingEnvironment.VirtualPathProvider ). Para este caso, querrá convertir el ejemplo anterior para usar BundleTable.VirtualPathProvider.DirectoryExistsy BundleTable.VirtualPathProvider.GetDirectory. Las búsquedas de patrones de archivo se vuelven un poco más problemáticas, pero son un buen punto de partida.
SliverNinja - MSFT
Esto solucionó el problema para mí. Todavía no he descubierto quién es el paquete ofensivo. Gracias por esta poderosa muestra de código, me salvaste de mayores molestias esta tarde.
Don Rolling
3

Hoy me encontré con el mismo problema; en realidad, descubrí que algunos de los archivos de ~ / Scripts no están publicados. El problema se resuelve después de publicar los archivos que faltan.

Naga
fuente
2

También obtuve este error al tener directorios inexistentes en mi archivo bundles.config. Cambiando esto:

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

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

Resuelve el problema por mí.

JerSchneid
fuente
2

Como @JerSchneid, mi problema eran los directorios vacíos, pero mi proceso de implementación era diferente al OP. Estaba haciendo una implementación basada en git en Azure (que usa Kudu) y no me di cuenta de que git no incluye directorios vacíos en el repositorio. Ver https://stackoverflow.com/a/115992/1876622

Entonces mi estructura de carpetas local era:

[Project Root] / Content / jquery-plugins // tenía archivos

[Project Root] / Scripts / jquery-plugins // tenía archivos

[Project Root] / Scripts / misc-plugins // carpeta vacía

Mientras que cualquier clon / extracción de mi repositorio en el servidor remoto no obtenía dicho directorio vacío:

[Project Root] / Content / jquery-plugins // tenía archivos

[Project Root] / Scripts / jquery-plugins // tenía archivos

El mejor enfoque para solucionar este problema es crear un archivo .keep en el directorio vacío. Vea esta solución SO: https://stackoverflow.com/a/21422128/1876622

HeyZiko
fuente
2

Tuve el mismo problema. el problema en mi caso fue que la carpeta del script con todos los scripts bootstrap / jqueries no estaba en la carpeta wwwroot. una vez que agregué la carpeta del script a wwwroot, el error desapareció.

rafaelzm2000
fuente
1

Esto también puede deberse a una condición de carrera durante la implementación:

Si usa "Publicar" de Visual Studio para implementar en un recurso compartido de archivos de red, y marque "Eliminar todos los archivos existentes antes de publicarlos". (Hago esto a veces para asegurarme de que no estemos dependiendo sin saberlo de los archivos que se han eliminado del proyecto pero que todavía están colgados en el servidor).

Si alguien visita el sitio antes de que se vuelvan a implementar todos los archivos JS / CSS necesarios, se iniciará Application_Starty RegisterBundlesno podrá construir correctamente los paquetes y lanzar esta excepción.

Pero para cuando obtenga esta excepción y revise el servidor, ¡todos los archivos necesarios están justo donde deberían estar!

Sin embargo, la aplicación continúa felizmente sirviendo al sitio, generando 404 para cualquier solicitud de paquete, junto con las páginas sin estilo / no funcionales que resultan de esto, y nunca intenta reconstruir los paquetes incluso después de que los archivos JS / CSS necesarios estén ahora disponibles.

Una nueva implementación usando "Reemplazar archivos coincidentes con copias locales" hará que la aplicación se reinicie y registre correctamente los paquetes esta vez.

CrazyPyro
fuente
1

Esto puede ser un problema antiguo. Tengo un error similar y, en mi caso, era la carpeta Scripts escondida en mi carpeta de modelos. El seguimiento de la pila dice claramente que falta el directorio y, de forma predeterminada, todos los scripts de Java deben estar en la carpeta de scripts. Es posible que esto no sea aplicable a los usuarios anteriores.

CuriousRK
fuente
1

Creé una nueva Angularaplicación y escribí

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

pero había creado no services, por lo que la servicescarpeta no se implementó en la publicación porque estaba vacía. Desafortunadamente, debe colocar un archivo ficticio dentro de cualquier carpeta vacía para que se publique.

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
fuente
1

Yo también enfrenté el mismo problema. Navegó hasta la ruta del archivo en Carpeta de secuencia de comandos. Copió el nombre exacto del archivo y realizó el cambio en bundle.cs:

Código antiguo: //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-*"));

    }
}

Nuevo código :

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
fuente
1

Tuve este problema cuando abrí un proyecto VS2017 en VS2015, construí la solución y luego cargué las DLL.

Reconstruirlo en VS2017 y volver a cargar las DLL solucionó el problema.

Steve Woods
fuente
0

¡Tengo la misma pregunta! Lo parece con IIS Express. Cambio la URL de IIS Express para Project Like:

"http://localhost:3555/"

luego el problema desapareció.

usuario2320546
fuente
0

Mi problema fue que mi sitio no tenía archivos para empaquetar. Sin embargo, había creado el sitio con una plantilla MVC, que incluye scripts jQuery. Bundle.config se refería a esos archivos y sus carpetas. No necesitando los scripts, los borré. Después de editar bundle.config, todo fue bien.

CraigP
fuente
0

Todo funcionaba bien, luego, mientras realizaba cambios no relacionados y en la siguiente compilación, se encontró con el mismo problema. Usé el control de código fuente para compararlo con versiones anteriores y descubrí que mi carpeta ../Content/Scripts se había vaciado misteriosamente.

Restaurado ../Content/Scripts/*.*desde una copia de seguridad y todo funcionó bien!

ps: El uso de VS2012, MVC4, había actualizado recientemente algunos paquetes de NuGet, por lo que podría haber jugado algún papel en el problema, pero todo funcionó bien por un tiempo después de la actualización, así que no estoy seguro.

nspire
fuente
0

busque en su archivo BundleConfig.cs las líneas que invoca a IncludeDirectory ()

es decir:

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

mi directorio Grid no existía.

RolandoCC
fuente
0

También tuve este error cuando combiné todos mis paquetes separados en un solo paquete.

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

Cambiado a

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

Tuve que actualizar el grupo de aplicaciones en el panel de control de mi alojamiento compartido para solucionar este problema.

rene anderson
fuente
0

Eliminar estas líneas de código del archivo de clase bundleConfig.cs resolvió mi desafío:

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

Ninguna de estas respuestas me ayudó ya que creé mis jsxarchivos de una manera extraña. Mi código estaba funcionando en modo localhost pero falló en producción.

La solución para mí fue ir al csprojarchivo y cambiar las rutas del archivo de <None ...a<Content ...

JacobIRR
fuente
0

Básicamente, el seguimiento de la pila le brinda el lugar exacto (como se resalta en la captura de pantalla) donde necesita eliminar el recurso no existente.

imagen que muestra el rastro de la pila

sandeep talabathula
fuente