Каталог не существует. Имя параметра: directoryVirtualPath


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

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

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

Я удалил все, и ошибка исчезла.


2
Не уверен, насколько это «удивительно непонятно» или трудно найти; stacktrace указывает прямо на BundleConfig.RegisterBundlesвызов от Application_StartMy +1, который вместо этого переходит к ответу @ user2465004.
CrazyPyro

3
Я получил ту же ошибку, потому что папка / scripts /, указанная в моих пакетах, не существует на моем сервере.
user1616625

Я преобразовал проект 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.
Stimms

Для меня это была проблема с 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
Отличный пример - только вот что 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, моя проблема заключалась в пустых каталогах, но мой процесс развертывания отличался от OP. Я выполнял развертывание на основе git в Azure (который использует Kudu) и не понимал, что git не включает пустые каталоги в репо. См. Https://stackoverflow.com/a/115992/1876622

Итак, моя локальная структура папок была:

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

[Project Root] / Scripts / jquery-plugins // были файлы

[Project Root] / Scripts / misc-plugins // пустая папка

Принимая во внимание, что любое клонирование / извлечение моего репозитория на удаленном сервере не получало указанный пустой каталог:

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

[Project Root] / Scripts / jquery-plugins // были файлы

Лучший способ исправить это - создать файл .keep в пустом каталоге. См. Это решение SO: https://stackoverflow.com/a/21422128/1876622


2

Я была такая же проблема. В моем случае проблема заключалась в том, что папки сценария со всеми сценариями начальной загрузки / jqueries не было в папке wwwroot. как только я добавил папку сценария в wwwroot, ошибка исчезла.


1

Это также может быть вызвано состоянием гонки при развертывании:

Если вы используете Visual Studio «Опубликовать» для развертывания через сетевой файловый ресурс и установите флажок «Удалить все существующие файлы перед публикацией». (Иногда я делаю это, чтобы убедиться, что мы не по незнанию все еще зависим от файлов, которые были удалены из проекта, но все еще зависают на сервере.)

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

Но к тому времени, когда вы получите это исключение и отправитесь проверять сервер, все необходимые файлы окажутся там, где они должны быть!

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

Повторное развертывание с использованием функции «Заменить совпадающие файлы локальными копиями» вызовет перезапуск приложения и на этот раз правильную регистрацию пакетов.


1

Это может быть старая проблема. У меня похожая ошибка, и в моем случае это была папка Scripts, скрывающаяся в моей папке Models. Трассировка стека четко указывает на отсутствие каталога, и по умолчанию все сценарии Java должны находиться в папке сценариев. Это может быть неприменимо к вышеуказанным пользователям.


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 Folder. Скопировал точное имя файла и внес изменения в 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));

моя грид-директория не существует.


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.