2012-07-03 21 views
98

i acaba de publicar mi proyecto a mi anfitrión en Arvixe y obtener este error (Funciona bien local):El directorio no existe. Nombre de parámetro: directoryVirtualPath

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?

Respuesta

199

tuve el mismo problema y descubrió que tenía algunos bultos que apuntaban a no exisiting archivos usando {version} y * comodines como

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

Quité todos aquellos y el error fui .

+46

+10 si pudiera. Un tema increíblemente oscuro. –

+4

Votaron el comentario de @EricJ. para dar +10 a esta respuesta ... – awe

+0

+10000 - gracias por esto también estoy con Arvixe y nunca hubiera encontrado esto. Estoy usando un proyecto de Web API sin ninguna interfaz, por lo tanto, no necesitaba ningún budle.config en absoluto – Kwakker35

0

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

"http://localhost:3555/" 

luego el problema desapareció.

7

Aquí hay una clase rápida que escribí para que sea más fácil.

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, basta con sustituir 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") 
      ); 
+0

Gran ejemplo: solo tengo aquí que 'HostingEnvironment.MapPath' no toma en consideración [' BundleTable.VirtualPathProvider'] (https://aspnetoptimization.codeplex.com/SourceControl/latest#src/System.Web.Optimization/BundleTable .cs) extensiones que puede estar utilizando (_puede ser no predeterminado y no 'HostingEnvironment.VirtualPathProvider'_). En este caso, le conviene convertir el ejemplo anterior para usar 'BundleTable.VirtualPathProvider.DirectoryExists' y' BundleTable.VirtualPathProvider.GetDirectory'. ** Las búsquedas de ** Patrón de archivo se vuelven un poco más problemáticas, pero es un buen lugar para comenzar. – SliverNinja

+0

Esto me solucionó el problema. 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. –

2

También me dio este error por tener directorios inexistentes en mi archivo bundles.config. El cambio de este:

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

resolver el problema para mí.

15

Tuve este mismo problema y no fue un problema de código. Estaba usando la opción de publicar (no la de FTP) y Visual Studio no estaba cargando algunos de mis scripts/css al servidor azul porque no estaban "incluidos en mi proyecto". Por lo tanto, a nivel local funcionó muy bien, porque los archivos estaban allí en mi disco duro. Lo que resolvió este problema en mi caso fue "Proyecto> Mostrar todos los archivos ..." y haga clic con el botón secundario en los que no estaban incluidos, inclúyalos y publíquelos de nuevo

+0

+1 Esta es una respuesta mucho mejor que la aceptada, y tal vez debería fusionarse en ella. Ya que la primera cosa lógica que hacer en respuesta a un "archivo/directorio no encontrado" ya es verificar que exista. Pero en esta situación es un poco más furtivo, porque lo compruebas y existe localmente, pero no en el servidor. Para una situación aún más extraña, ver mi respuesta. – CrazyPyro

+0

También tuve este problema. Desplegar desde mi casilla 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. – stimms

+0

Para mí fue un problema con BitTorrent Sync utilizado para implementar archivos. Algunos archivos simplemente no se implementaron debido a algún problema ... – Filip

0

Esto también puede ser causado por una condición de carrera durante la implementación:

Si usa Visual Studio "Publicar" para implementar en un recurso compartido de archivos de red, y marca "Eliminar todos los archivos existentes antes de publicar". (Esto lo hago a veces para asegurarme de que no estamos, sin saberlo, todavía en función de los archivos que se han eliminado del proyecto, pero que todavía están en el servidor).

Si alguien visita el sitio antes que todo el JS/CSS requerido los archivos se vuelven a implementar, se iniciará Application_Start y RegisterBundles, que no podrá construir correctamente los paquetes y lanzar esta excepción.

Pero para el momento en que obtenga esta excepción y vaya a comprobar el servidor, ¡todos los archivos necesarios están justo donde deberían estar!

Sin embargo, la aplicación continúa sirviendo al sitio, generando 404 para cualquier solicitud de paquete, junto con las páginas sin diseño/unfunctional que resultan de esto, y nunca trata de reconstruir los paquetes incluso después de que los archivos JS/CSS necesarios son ya disponible.

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

3

Me encontré con el mismo problema hoy en día, en realidad, descubrí que algunos de los archivos en ~/Scripts no están publicados. El problema se resuelve después de que publiqué los archivos faltantes

0

Mi problema fue que mi sitio no tenía archivos para agrupar. Sin embargo, había creado el sitio con una plantilla MVC, que incluye scripts jQuery. Bundle.config se refiere a esos archivos y sus carpetas. Al no necesitar los scripts, los eliminé. Después de editar bundle.config, todo estaba bien.

2

Al igual que @JerSchneid, mi problema eran los directorios vacíos, pero mi proceso de implementación era diferente al de OP. Estaba haciendo un despliegue basado 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

Así que mi estructura de carpetas locales fue:

[Root] Proyecto/content/plugins jquery-// archivos tenido

[raíz del proyecto]/Scripts/jquery-plugins // Had archivos

[raíz del proyecto]/scripts/misc-plugins // vaciar la carpeta

mientras que cualquier clon/tirón de mi repositorio en el mano a distancia servidor de correo no estaba recibiendo dicho directorio vacío:

[Proyecto Raíz]/content/plugins jquery-// Ficheros tenido

[Root] Proyecto/scripts/jquery-plugins // tenía archivos

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

1

Esto puede ser un problema antiguo. Tengo un error similar y en mi caso fue la carpeta de scripts escondida en mi carpeta de modelos. Stack trace dice claramente que falta su directorio y, por defecto, todos los scripts de Java deben estar en la carpeta de scripts. Esto puede no ser aplicable a los usuarios anteriores.

1

que había creado una nueva aplicación Angular y escrita

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

pero yo había creado ningún services, por lo que la carpeta services no estaba desplegado en publicar ya que estaba vacío. Desafortunadamente, usted tiene que poner 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/

0

Todo trabajaba bien, a continuación, al tiempo que los cambios no relacionados y en la próxima construcción se encontró con el mismo problema. ¡Usé el control de fuente para compararlo con las versiones anteriores y descubrí que mi carpeta ../Content/Scripts se había vaciado misteriosamente!

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

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

1

Yo también enfrenté el mismo problema. Navegado a la ruta del archivo de secuencias de comandos bajo Folder.Copied el nombre exacto del archivo y hace 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")); 
     } 
} 
0

mirada en sus BundleConfig.cs archivo para las líneas que invoca IncludeDirectory()

es decir:

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

mi directorio de Grid no existe.

0

También tuve este error cuando combiné todos mis paquetes separados en un 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 grupo de aplicaciones de actualización en mi panel de control compartido de alojamiento para solucionar este problema.

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.

1

Tuve el mismo problema. el problema en mi caso era 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ó.

0

retirar esta líneas de código del archivo de clase bundleConfig.cs resolvieron mi reto:

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