Каталог не існує. Назва параметра: каталогVirtualPath


115

я щойно опублікував свій проект своєму хосту на Arvixe і отримав цю помилку (працює чудово на місцевому рівні):

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

Що це означає ?

Відповіді:


229

У мене була така ж проблема і з'ясувалося, що у мене були деякі пачки, які вказували на неіснуючі файли за допомогою {version} та * макіяжів, таких як

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

Я все це видалив, і помилка пішла.


2
Не впевнений, як це "дивно незрозуміло" чи важко знайти; стек-трек вказує, що ви прямо на BundleConfig.RegisterBundlesдзвінок з Application_Startпункту "Мій +1" замість цього надсилаєте відповідь @ user2465004.
CrazyPyro

3
Я отримав таку ж помилку, оскільки / скрипти / папка, згадані в моїх пакетах, не існували на моєму сервері.
користувач1616625

Я перетворив проект asp.net mvc в веб-api і справді не користувався файлами jquery, css. Радий, що знайшов твій пост. Виправлено і все працює нормально.
Сем

3
На додаток до цього, при публікації в Azure, здається, не можна публікувати порожні папки. У мене був оператор .IncludeDirectory ("~ / Scripts / Create / Controllers", "* .js"), і в той час як папка Controllers насправді існувала, у неї насправді нічого ще не було, і це спричинило ту саму помилку. Я просто помістив чистий текстовий файл у папку, і тоді він спрацював.
RamblerToning

Це сталося зі мною, коли в конфігурацію пакету були пусті каталоги, до яких я планував додати файли в майбутньому. Локально все було добре, тому що ці каталоги існували, але коли я переїхав до Azure, вони не були створені,
JMK

16

У мене був цей самий випуск, і це не проблема коду. Я використовував опцію публікації (не FTP), і Visual Studio не завантажував деякі з моїх скриптів / css на сервер azure, оскільки вони не були "включені в мій проект". Отже, локально це спрацювало чудово, бо файли були на моєму жорсткому диску. Що вирішило цю проблему в моєму випадку: "Проект> Показати всі файли ..." та клацніть правою кнопкою миші ті, які не були включені, включіть їх та опублікуйте ще раз


+1 Це набагато краща відповідь, ніж прийнята, і, можливо, її слід об'єднати. Оскільки перше логічне, що потрібно зробити у відповідь на "файл / каталог не знайдено" - це вже перевірити, чи він існує. Але в цій ситуації це трохи примхливіше, тому що ви перевіряєте, і він існує локально, тільки не на сервері. Для ще більш дивної ситуації дивіться мою відповідь.
CrazyPyro

У мене теж було це питання. Розгортання з мого локального вікна працювало, але з сервера збирання цього не сталося. Виявилося, що сервер збірки не включає файли .js, згенеровані компілятором TypeScript в пакеті. Ймовірно, старіша версія інструментів TypeScript на сервері збірки. Як швидке виправлення я включив у проект файли .js.
стимули

Для мене це була проблема з BitTorrent Sync, що використовується для розгортання файлів. Деякі файли просто не були розгорнуті через деякі збої ..
Філіп

10

Ось короткий клас, який я написав, щоб полегшити це.

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

Для його використання просто замініть ScriptBundle на BundleRelaxed у своєму коді, як у:

        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
Чудовий приклад - лише gotcha тут полягає в тому, HostingEnvironment.MapPathщо не враховує BundleTable.VirtualPathProviderрозширення, які ви можете використовувати ( може бути не за замовчуванням, а ніHostingEnvironment.VirtualPathProvider ). У цьому випадку ви хочете перетворити приклад вище для використання BundleTable.VirtualPathProvider.DirectoryExistsтаBundleTable.VirtualPathProvider.GetDirectory . Пошук файлових шаблонів стає трохи більш проблематичним, але добре почати.
SliverNinja - MSFT

Це вирішило для мене проблему. Досі не з'ясували, хто такий згубний набір. Дякую за цей потужний зразок коду, ви врятували мене від подальшого загострення сьогодні вдень.
Дон Роллінг

3

Я зіткнувся з тією ж проблемою сьогодні, адже я фактично виявив, що деякі файли під ~ / Scripts не публікуються. Проблема вирішується після публікації відсутніх файлів


2

Я також отримав цю помилку, маючи у моєму файлі bundles.config неіснуючі каталоги. Зміна цього:

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

До цього:

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

Вирішіть проблему для мене.


2

Як і @JerSchneid, моя проблема була порожніми каталогами, але мій процес розгортання відрізнявся від ОП. Я робив розгортання на основі git на Azure (який використовує Kudu), і не зрозумів, що git не включає порожні каталоги в репо. Дивіться https://stackoverflow.com/a/115992/1876622

Отже, моя локальна структура папок:

[Project Root] / Content / jquery-plugins // мали файли

[Project Root] / Сценарії / jquery-плагіни // мали файли

[Корінь проекту] / Сценарії / misc-плагіни // порожня папка

В той час, як будь-який клон / витяг мого сховища на віддаленому сервері не отримував зазначення порожнього каталогу:

[Project Root] / Content / jquery-plugins // мали файли

[Project Root] / Сценарії / jquery-плагіни // мали файли

Найкращим підходом до виправлення цього є створення .keep-файлу в порожньому каталозі. Дивіться це рішення ТА: https://stackoverflow.com/a/21422128/1876622


2

У мене було те саме питання. Проблема в моєму випадку полягала в тому, що папка сценарію з усіма сценаріями bootstrap / jqueries не знаходилась у папці wwwroot. як тільки я додав папку сценарію до wwwroot, помилка пішла.


1

Це також може бути спричинено умовами перегонів під час розгортання:

Якщо ви використовуєте "Опублікувати" Visual Studio для розгортання спільного доступу до мережевих файлів та встановіть прапорець "Видалити всі існуючі файли перед публікацією". (Я роблю це іноді для того, щоб ми все ще не усвідомлювали себе залежно від файлів, які були видалені з проекту, але все ще висять на сервері.)

Якщо хтось потрапить на сайт до того, як всі необхідні файли JS / CSS будуть повторно розгорнуті, він запуститься Application_StartіRegisterBundles не вдасться належним чином сконструювати пакети та викинути цей виняток.

Але до того моменту, коли ви отримаєте цей виняток і перейдете перевірити сервер, всі необхідні файли є саме там, де вони повинні бути!

Однак додаток із задоволенням продовжує обслуговувати сайт, генеруючи 404 для будь-якого запиту пакетів, разом із нестильованими / нефункціональними сторінками, які є результатом цього, і ніколи не намагається відновити пакет навіть після того, як необхідні файли JS / CSS тепер доступні.

Повторне розгортання за допомогою "Замінити відповідні файли локальними копіями" призведе до того, що програма перезапустить і належним чином зареєструє пакети цього разу.


1

Це може бути стара проблема. У мене схожа помилка, і в моєму випадку папка Scripts ховалася в моїй папці моделей. Стежка стека чітко говорить про відсутність Каталогу, і за замовчуванням усі сценарії Java повинні бути в папці Scripts. Це може не стосуватися вищезгаданих користувачів.


1

Я створив нову Angularзаявку і написав

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

але я створив "ні" services, тому servicesпапка не була розгорнута при публікації, оскільки вона порожня. На жаль, ви повинні помістити фіктивний файл у будь-яку порожню папку, щоб він міг публікуватись

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


1

Я теж зіткнувся з тим же питанням. Перегляньте шлях до файлу в папці Script.Копіював точне ім'я файлу та вніс зміни в bundle.cs:

Старий код: //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-*"));

    }
}

Новий код:

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

1

У мене виникло це питання, коли я відкрив проект VS2017 у VS2015, створив рішення та потім завантажив DLL-файли.

Відновлення його у VS2017 та повторне завантаження DLL вирішили проблему.


0

У мене те саме питання! Здається, з IIS Express. Я змінюю URL-адресу IIS Express для Project Like:

"http://localhost:3555/"

тоді проблема пішла.


0

Моя проблема полягала в тому, що на моєму сайті не було файлів для зв’язку. Однак я створив сайт із шаблоном MVC, який включає сценарії jQuery. Bundle.config посилався на ці файли та їх папки. Не потребуючи сценаріїв, я видалив їх. Після редагування bundle.config все було добре.


0

Все працювало чудово, тоді під час внесення незв’язаних змін і при наступному складанні натрапив на те саме питання. Використовував керування джерелами для порівняння з попередніми версіями та виявив, що папку ../Content/Scripts таємниче було випорожнено!

Відновлено ../Content/Scripts/*.*з резервної копії і все працювало добре!

ps: Використовуючи VS2012, MVC4, нещодавно оновив деякі пакети NuGet, так що це, можливо, зіграло певну роль у випуску, але все пройшло певний час після оновлення, тому не впевнений.


0

подивіться у свій файл BundleConfig.cs для рядків, які викликають IncludeDirectory ()

тобто:

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

мій каталог Grid не існував.


0

У мене також була ця помилка, коли я об'єднав усі відокремлені групи в один пакет.

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

Змінено на

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

Щоб виправити цю проблему, мені довелося оновити пул додатків на панелі керування мого спільного хостингу.


0

Видалення цього рядка коду з файлу класу bundleConfig.cs вирішило мою проблему:

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

0

Жодна з цих відповідей мені не допомогла, оскільки я створив свої jsxфайли дивним чином. Мій код працював у режимі localhost, але не вдався у виробництві.

Виправленням для мене було зайти у csprojфайл та змінити шляхи <None ...до файлу<Content ...


0

В основному слід стека дає точне місце (як підкреслено на скріншоті), вам потрібно видалити неіснуючий ресурс.

зображення, що показує стек стека

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.