O diretório não existe. Nome do parâmetro: directoryVirtualPath

115

Acabei de publicar meu projeto para meu host na Arvixe e recebo este erro (funciona bem 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

O que isso significa ?

BjarkeCK
fonte

Respostas:

229

Eu tive o mesmo problema e descobri que tinha alguns pacotes que apontavam para arquivos inexistentes usando {version} e * curingas, como

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

Tirei tudo isso e o erro foi embora.

Martin Ørding-Thomsen
fonte
2
Não tenho certeza de como isso é "incrivelmente obscuro" ou difícil de encontrar; o rastreamento de pilha aponta diretamente para a BundleConfig.RegisterBundleschamada de Application_StartMeu +1 que vai para a resposta de @ user2465004.
CrazyPyro de
3
Recebi o mesmo erro porque a pasta / scripts / referida em meus pacotes não existia em meu servidor.
user1616625
Converti um projeto mvc do asp.net para API da web e realmente não usei jquery, arquivos css. Que bom que encontrei sua postagem. Consertou e tudo está funcionando bem.
Sam
3
Além disso, ao publicar no Azure, não parece permitir que você publique pastas vazias. Eu tinha uma instrução .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js") e, embora a pasta Controllers realmente existisse, ela ainda não tinha nada nela e isso causou o mesmo erro. Acabei de colocar um arquivo de texto em branco na pasta e funcionou.
RamblerToning
Isso aconteceu comigo quando eu tinha diretórios vazios incluídos na configuração do meu pacote, ao qual planejava adicionar arquivos no futuro. Tudo estava bem localmente porque esses diretórios existiam, mas quando eu empurrei para o Azure, eles não foram criados,
JMK
16

Eu tive esse mesmo problema e não era um problema de código. Eu estava usando a opção de publicação (não a de FTP) e o Visual Studio não estava carregando alguns dos meus scripts / css para o servidor azure porque eles não foram "incluídos no meu projeto". Então, localmente funcionou bem, porque os arquivos estavam lá no meu disco rígido. O que resolveu esse problema no meu caso foi "Projeto> Mostrar todos os arquivos ..." e clique com o botão direito nos que não foram incluídos, inclua-os e publique novamente

dsnunez
fonte
+1 Esta é uma resposta muito melhor do que a aceita, e talvez deva ser incorporada a ela. Visto que a primeira coisa lógica a fazer em resposta a um "arquivo / diretório não encontrado" já é verificar se ele existe. Mas nessa situação é um pouco mais sorrateiro, porque você verifica e ele existe localmente, mas não no servidor. Para uma situação ainda mais estranha, veja minha resposta.
CrazyPyro de
Eu também tive esse problema. A implantação da minha máquina local funcionou, mas não do servidor de compilação. Acontece que o servidor de compilação não estava incluindo os arquivos .js gerados pelo compilador TypeScript no pacote. Provavelmente uma versão mais antiga das ferramentas TypeScript no servidor de compilação. Como uma solução rápida, incluí os arquivos .js no projeto.
estimula
Para mim, era um problema com o BitTorrent Sync usado para implantar arquivos. Alguns arquivos simplesmente não foram implantados devido a alguma falha.
Filip
10

Aqui está uma aula rápida que escrevi para tornar isso mais 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 usá-lo, basta substituir ScriptBundle por BundleRelaxed em seu código, como em:

        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
fonte
2
Ótimo exemplo - apenas o pegadinha aqui é que HostingEnvironment.MapPathnão leva em consideração as BundleTable.VirtualPathProviderextensões que você pode estar usando ( pode ser não padrão ou nãoHostingEnvironment.VirtualPathProvider ). Nesse caso, você deseja converter o exemplo acima para usar BundleTable.VirtualPathProvider.DirectoryExistse BundleTable.VirtualPathProvider.GetDirectory. As pesquisas de padrão de arquivo se tornam um pouco mais problemáticas, mas é um bom lugar para começar.
SliverNinja - MSFT
Isso resolveu o problema para mim. Ainda não descobri quem é o pacote ofensivo. Obrigado por este poderoso exemplo de código, você me salvou de mais aborrecimentos esta tarde.
Don Rolling
3

Encontrei o mesmo problema hoje; na verdade, descobri que alguns arquivos em ~ / Scripts não foram publicados. O problema foi resolvido depois que publiquei os arquivos ausentes

Naga
fonte
2

Também recebi esse erro por ter diretórios inexistentes em meu arquivo bundles.config. Mudando isso:

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

Para isso:

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

Resolva o problema para mim.

JerSchneid
fonte
2

Como @JerSchneid, meu problema eram diretórios vazios, mas meu processo de implantação era diferente do OP. Eu estava fazendo uma implantação baseada em git no Azure (que usa Kudu) e não percebi que o git não inclui diretórios vazios no repo. Vejo https://stackoverflow.com/a/115992/1876622

Portanto, minha estrutura de pasta local era:

[Project Root] / Content / jquery-plugins // tinha arquivos

[Project Root] / Scripts / jquery-plugins // tinha arquivos

[Project Root] / Scripts / misc-plugins // pasta vazia

Considerando que qualquer clone / pull do meu repositório no servidor remoto não estava obtendo o referido diretório vazio:

[Project Root] / Content / jquery-plugins // tinha arquivos

[Project Root] / Scripts / jquery-plugins // tinha arquivos

A melhor abordagem para corrigir isso é criar um arquivo .keep no diretório vazio. Veja esta solução SO: https://stackoverflow.com/a/21422128/1876622

HeyZiko
fonte
2

Eu tive o mesmo problema. o problema no meu caso era que a pasta do script com todos os scripts bootstrap / jqueries não estava na pasta wwwroot. depois de adicionar a pasta do script ao wwwroot, o erro desapareceu.

rafaelzm2000
fonte
1

Isso também pode ser causado por uma condição de corrida durante a implantação:

Se você usar "Publicar" do Visual Studio para implantar em um compartilhamento de arquivo de rede, marque "Excluir todos os arquivos existentes antes de publicar". (Eu faço isso às vezes para garantir que não estejamos ainda dependendo de arquivos que foram removidos do projeto, mas ainda estão pendurados no servidor.)

Se alguém acessar o site antes que todos os arquivos JS / CSS necessários sejam reimplantados, ele será iniciado Application_Starte RegisterBundlesnão conseguirá construir os pacotes corretamente e lançar essa exceção.

Mas quando você obtiver essa exceção e for verificar o servidor, todos os arquivos necessários estarão exatamente onde deveriam estar!

No entanto, o aplicativo felizmente continua a servir o site, gerando 404's para qualquer solicitação de pacote, junto com as páginas não estilizadas / não funcionais que resultam disso, e nunca tenta reconstruir os pacotes, mesmo depois que os arquivos JS / CSS necessários estão agora disponíveis.

Uma nova implantação usando "Substituir arquivos correspondentes por cópias locais" fará com que o aplicativo reinicie e registre corretamente os pacotes desta vez.

CrazyPyro
fonte
1

Este pode ser um problema antigo. Eu tenho um erro semelhante e, no meu caso, era a pasta Scripts escondida na minha pasta Modelos. O rastreamento de pilha diz claramente que seu diretório está faltando e, por padrão, todos os scripts Java devem estar na pasta Scripts. Isso pode não ser aplicável aos usuários acima.

CuriousRK
fonte
1

Eu tinha criado um novo Angularaplicativo e escrito

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

mas eu tinha criado não services, então a servicespasta não foi implantada na publicação porque estava vazia. Infelizmente, você tem que colocar um arquivo fictício dentro de qualquer pasta vazia para que seja publicado

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

tique
fonte
1

Eu também enfrentei o mesmo problema. Navegou até o caminho do arquivo na pasta de script. Copiou o nome exato do arquivo e fez a alteração em bundle.cs:

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

    }
}

Novo 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
fonte
1

Tive esse problema quando abri um projeto VS2017 no VS2015, construí a solução e carreguei as DLLs.

Reconstruí-lo no VS2017 e reenviar as DLLs corrigiu o problema.

Steve Woods
fonte
0

Eu tenho a mesma pergunta! Parece que com o IIS Express. Eu mudo o URL do IIS Express para Projeto como:

"http://localhost:3555/"

então o problema desapareceu.

user2320546
fonte
0

Meu problema era que meu site não tinha arquivos para agrupar. No entanto, criei o site com um modelo MVC, que inclui scripts jQuery. O bundle.config referia-se a esses arquivos e suas pastas. Sem precisar dos scripts, eu os apaguei. Depois de editar o bundle.config, tudo estava bem.

CraigP
fonte
0

Tudo estava funcionando bem, então ao fazer alterações não relacionadas e na próxima compilação encontrei o mesmo problema. Usei o controle de origem para comparar com versões anteriores e descobri que minha pasta ../Content/Scripts foi misteriosamente esvaziada!

Restaurado ../Content/Scripts/*.* de um backup e tudo funcionou bem!

ps: usando VS2012, MVC4, recentemente atualizou alguns pacotes NuGet, então isso pode ter desempenhado algum papel no problema, mas tudo funcionou bem por um tempo após a atualização, então não tenho certeza.

nspire
fonte
0

procure em seu arquivo BundleConfig.cs as linhas que invocam IncludeDirectory ()

ie:

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

meu diretório Grid não existia.

RolandoCC
fonte
0

Eu também tive esse erro quando combinei todos os meus pacotes separados em um pacote.

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

Mudou para

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

Tive que atualizar o pool de aplicativos no painel de controle da minha hospedagem compartilhada para corrigir esse problema.

rene anderson
fonte
0

Remover essas linhas de código do arquivo de classe bundleConfig.cs resolveu meu desafio:

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

Nenhuma dessas respostas me ajudou, já que criei meus jsxarquivos de uma forma estranha. Meu código estava funcionando no modo localhost, mas falhou na produção.

A correção para mim foi acessar o csprojarquivo e alterar os caminhos de arquivo de <None ...para<Content ...

JacobIRR
fonte
0

Basicamente, o rastreamento de pilha fornece o local exato (conforme destacado na captura de tela) de que você precisa para remover recursos inexistentes.

imagem mostrando rastreamento de pilha

Sandeep Talabathula
fonte