Katalog nie istnieje. Nazwa parametru: directoryVirtualPath

115

Właśnie opublikowałem swój projekt dla mojego hosta w Arvixe i otrzymałem ten błąd (działa dobrze lokalnie):

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

Co to znaczy ?

BjarkeCK
źródło

Odpowiedzi:

229

Miałem ten sam problem i odkryłem, że mam kilka pakietów wskazujących na nieistniejące pliki przy użyciu {wersja} i * symboli wieloznacznych, takich jak

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

Usunąłem je wszystkie i błąd zniknął.

Martin Ørding-Thomsen
źródło
2
Nie jestem pewien, jak to jest „niezwykle niejasne” lub trudne do znalezienia; śledzenie stosu kieruje Cię bezpośrednio do BundleConfig.RegisterBundleswywołania z Application_StartMy +1, zamiast tego przechodzi do odpowiedzi @ user2465004.
CrazyPyro,
3
Otrzymałem ten sam błąd, ponieważ folder / scripts /, o którym mowa w moich pakietach, nie istnieje na moim serwerze.
user1616625
Przekonwertowałem projekt mvc asp.net na interfejs API sieci Web i naprawdę nie korzystałem z plików jquery, css. Cieszę się, że znalazłem twój post. Naprawiono to i wszystko działa dobrze.
Sam
3
Poza tym podczas publikowania na platformie Azure wydaje się, że nie pozwala na publikowanie pustych folderów. Miałem instrukcję .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js") i chociaż folder Controllers rzeczywiście istniał, w rzeczywistości nic w nim nie było, co spowodowało ten sam błąd. Po prostu umieściłem pusty plik tekstowy w folderze i zadziałało.
RamblerToning
Zdarzyło mi się to, gdy miałem puste katalogi zawarte w konfiguracji paczki, do której planowałem dodać pliki w przyszłości. Wszystko było w porządku lokalnie, ponieważ te katalogi istniały, ale kiedy wrzuciłem na Azure, nie zostały utworzone,
JMK
16

Miałem ten sam problem i nie był to problem z kodem. Używałem opcji publikowania (nie FTP), a program Visual Studio nie przekazywał niektórych moich skryptów / CSS na serwer Azure, ponieważ nie zostały one „uwzględnione w moim projekcie”. Tak więc lokalnie działało dobrze, ponieważ pliki były na moim dysku twardym. Rozwiązaniem tego problemu w moim przypadku było „Projekt> Pokaż wszystkie pliki ...” i kliknij prawym przyciskiem myszy te, które nie zostały uwzględnione, dołącz je i opublikuj ponownie

dsnunez
źródło
+1 To znacznie lepsza odpowiedź niż zaakceptowana i może powinna zostać z nią połączona. Ponieważ pierwszą logiczną rzeczą do zrobienia w odpowiedzi na "plik / katalog nie został znaleziony" jest już sprawdzenie, czy istnieje. Ale w tej sytuacji jest trochę podstępnie, bo sprawdzasz i istnieje lokalnie, tylko nie na serwerze. Jeśli chodzi o jeszcze dziwniejszą sytuację, zobacz moją odpowiedź.
CrazyPyro,
Ja też miałem ten problem. Wdrażanie z mojego lokalnego pudełka działało, ale z serwera kompilacji nie. Okazało się, że serwer kompilacji nie zawierał plików .js wygenerowanych przez kompilator TypeScript w pakiecie. Prawdopodobnie starsza wersja narzędzi TypeScript na serwerze kompilacji. Jako szybkie rozwiązanie dołączyłem do projektu pliki .js.
stymulacje
Dla mnie był to problem z BitTorrent Sync używanym do wdrażania plików. Niektóre pliki po prostu nie zostały wdrożone z powodu jakiegoś błędu ...
Filip
10

Oto krótka klasa, którą napisałem, aby to ułatwić.

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

Aby z niego skorzystać, po prostu zamień ScriptBundle na BundleRelaxed w swoim kodzie, jak w:

        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
źródło
2
Świetny przykład - tylko gotcha tutaj polega na tym, HostingEnvironment.MapPathże nie bierze pod uwagę BundleTable.VirtualPathProviderrozszerzeń, których możesz używać ( może być inne niż domyślne i nieHostingEnvironment.VirtualPathProvider ). W tym przypadku chciałbyś przekonwertować powyższy przykład na użycie BundleTable.VirtualPathProvider.DirectoryExistsi BundleTable.VirtualPathProvider.GetDirectory. Wyszukiwanie wzorców plików staje się nieco bardziej problematyczne, ale jest dobrym miejscem do rozpoczęcia.
SliverNinja - MSFT
To rozwiązało problem. Nadal nie zorientowałem się, kto jest obraźliwym pakietem. Dziękuję za ten potężny przykład kodu, uratowałeś mnie od dalszych irytacji dziś po południu.
Don Rolling
3

Dzisiaj natknąłem się na ten sam problem. W rzeczywistości okazało się, że niektóre pliki w katalogu ~ / Scripts nie są publikowane. Problem został rozwiązany po opublikowaniu brakujących plików

Naga
źródło
2

Otrzymałem również ten błąd, ponieważ w moim pliku bundles.config nie istnieją katalogi. Zmiana tego:

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

Do tego:

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

Rozwiąż problem za mnie.

JerSchneid
źródło
2

Podobnie jak @JerSchneid, moim problemem były puste katalogi, ale mój proces wdrażania był inny niż OP. Robiłem wdrażanie oparte na git na platformie Azure (która używa Kudu) i nie zdawałem sobie sprawy, że git nie zawiera pustych katalogów w repozytorium. Zobacz https://stackoverflow.com/a/115992/1876622

Więc moja struktura folderów lokalnych była następująca:

[Project Root] / Content / jquery-plugins // miał pliki

[Project Root] / Scripts / jquery-plugins // miał pliki

[Project Root] / Scripts / misc-plugins // pusty folder

Podczas gdy jakiekolwiek klonowanie / ściąganie mojego repozytorium na zdalnym serwerze nie otrzymywało pustego katalogu:

[Project Root] / Content / jquery-plugins // miał pliki

[Project Root] / Scripts / jquery-plugins // miał pliki

Najlepszym sposobem rozwiązania tego problemu jest utworzenie pliku .keep w pustym katalogu. Zobacz to rozwiązanie SO: https://stackoverflow.com/a/21422128/1876622

HeyZiko
źródło
2

Miałem ten sam problem. problem w moim przypadku polegał na tym, że folder skryptu ze wszystkimi skryptami bootstrap / jqueries nie znajdował się w folderze wwwroot. po dodaniu folderu skryptu do wwwroot błąd zniknął.

rafaelzm2000
źródło
1

Może to być również spowodowane sytuacją wyścigu podczas wdrażania:

Jeśli używasz funkcji „Publikuj” programu Visual Studio do wdrażania za pośrednictwem udziału plików w sieci i zaznacz opcję „Usuń wszystkie istniejące pliki przed opublikowaniem”. (Robię to czasami, aby upewnić się, że nie jesteśmy nieświadomie nadal zależni od plików, które zostały usunięte z projektu, ale nadal wiszą na serwerze).

Jeśli ktoś wejdzie na stronę, zanim wszystkie wymagane pliki JS / CSS zostaną ponownie wdrożone, uruchomi się Application_Starti RegisterBundlesnie uda się poprawnie skonstruować pakietów i wyrzucić ten wyjątek.

Ale zanim uzyskasz ten wyjątek i przejdziesz do sprawdzenia serwera, wszystkie niezbędne pliki są tam, gdzie powinny!

Jednak aplikacja szczęśliwie nadal obsługuje witrynę, generując błędy 404 dla każdego żądania pakietu, wraz z niestylizowanymi / niefunkcjonalnymi stronami, które z tego wynikają, i nigdy nie próbuje odbudować pakietów, nawet gdy niezbędne pliki JS / CSS są już dostępne.

Ponowne wdrożenie przy użyciu opcji „Zastąp pasujące pliki kopiami lokalnymi” spowoduje ponowne uruchomienie aplikacji i tym razem prawidłowe zarejestrowanie pakietów.

CrazyPyro
źródło
1

To może być stary problem, mam podobny błąd iw moim przypadku był to folder Scripts, który ukrywał się w folderze moich modeli. Śledzenie stosu wyraźnie wskazuje na brakujący katalog i domyślnie wszystkie skrypty Java powinny znajdować się w folderze skryptów. Może to nie dotyczyć powyższych użytkowników.

CiekawyRK
źródło
1

Stworzyłem nową Angularaplikację i napisałem

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

ale utworzyłem „nie” services, więc servicesfolder nie został wdrożony podczas publikowania, ponieważ był pusty. Niestety, musisz umieścić fałszywy plik w dowolnym pustym folderze, aby mógł zostać opublikowany

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

tik
źródło
1

Ja też stanąłem przed tym samym problemem. Przeszedłem do ścieżki do pliku w folderze skryptów, skopiowałem dokładną nazwę pliku i dokonałem zmiany w bundle.cs:

Stary kod: //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-*"));

    }
}

Nowy kod :

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
źródło
1

Miałem ten problem, kiedy otworzyłem projekt VS2017 w VS2015, zbudowałem rozwiązanie, a następnie załadowałem biblioteki DLL.

Odbudowanie go w VS2017 i ponowne przesłanie bibliotek DLL rozwiązało problem.

Steve Woods
źródło
0

Mam to samo pytanie! Wydaje się, że tak jest w przypadku IIS Express. Zmieniam adres URL programu IIS Express dla projektu, takiego jak:

"http://localhost:3555/"

wtedy problem zniknął.

user2320546
źródło
0

Mój problem polegał na tym, że moja witryna nie miała plików do spakowania. Jednak utworzyłem witrynę z szablonem MVC, który zawiera skrypty jQuery. Plik bundle.config odwoływał się do tych plików i ich folderów. Nie potrzebowałem skryptów, więc je usunąłem. Po edycji bundle.config wszystko poszło dobrze.

CraigP
źródło
0

Wszystko działało dobrze, a następnie podczas wprowadzania niepowiązanych zmian i przy następnej kompilacji napotkał ten sam problem. Użyłem kontroli źródła do porównania z poprzednimi wersjami i odkryłem, że mój folder ../Content/Scripts został w tajemniczy sposób opróżniony!

Przywrócono ../Content/Scripts/*.*z kopii zapasowej i wszystko działało dobrze!

ps: Używając VS2012, MVC4 niedawno zaktualizował niektóre pakiety NuGet, więc mogło to odegrać pewną rolę w problemie, ale wszystko działało dobrze przez jakiś czas po aktualizacji, więc nie jestem pewien.

nspire
źródło
0

zajrzyj do pliku BundleConfig.cs w poszukiwaniu wierszy, które wywołują IncludeDirectory ()

to znaczy:

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

mój katalog Grid nie istniał.

RolandoCC
źródło
0

Miałem również ten błąd, gdy łączyłem wszystkie moje oddzielne pakiety w jeden pakiet.

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

Zmienić na

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

Musiałem odświeżyć pulę aplikacji w panelu sterowania mojego hostingu współdzielonego, aby naprawić ten problem.

rene anderson
źródło
0

Usunięcie tych wierszy kodu z pliku klasy bundleConfig.cs rozwiązało moje wyzwanie:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
"~/Scripts/jquery-{version}.js"));
cholerny
źródło
0

Żadna z tych odpowiedzi nie pomogła mi, ponieważ utworzyłem swoje jsxpliki w dziwny sposób. Mój kod działał w trybie localhost, ale nie udało się go wyprodukować.

Rozwiązaniem dla mnie było wejście do csprojpliku i zmiana ścieżek plików z <None ...na<Content ...

JacobIRR
źródło
0

Zasadniczo ślad stosu podaje dokładne miejsce (jak zaznaczono na zrzucie ekranu), w którym musisz usunąć nieistniejący zasób.

obraz przedstawiający ślad stosu

sandeep talabathula
źródło