Каталог не существует. Имя параметра: 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

Что это означает ?

BjarkeCK
источник

Ответы:

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, потому что они не были «включены в мой проект». Итак, локально он работал нормально, потому что файлы были на моем жестком диске. Что решило эту проблему в моем случае, так это «Проект> Показать все файлы ...» и щелкните правой кнопкой мыши те, которые не были включены, включите их и опубликуйте снова.

dsnunez
источник
+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 не публикуются. Проблема решена после того, как я опубликовал недостающие файлы

Naga
источник
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>

Решите проблему за меня.

JerSchneid
источник
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

HeyZiko
источник
2

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

rafaelzm2000
источник
1

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

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

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

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

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

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

CrazyPyro
источник
1

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

CuriousRK
источник
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/"

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

user2320546
источник
0

Моя проблема заключалась в том, что на моем сайте не было файлов для объединения. Однако я создал сайт с шаблоном MVC, который включает скрипты jQuery. Пакет bundle.config относится к этим файлам и их папкам. Не нуждаясь в скриптах, я их удалил. После редактирования bundle.config все было хорошо.

CraigP
источник
0

Все работало нормально, затем при внесении несвязанных изменений и при следующей сборке возникла та же проблема. Использовал систему управления версиями для сравнения с предыдущими версиями и обнаружил, что моя папка ../Content/Scripts загадочным образом опустела!

Восстановил ../Content/Scripts/*.* из резервной копии и все заработало!

ps: Используя VS2012, MVC4 недавно обновил некоторые пакеты NuGet, так что это могло сыграть некоторую роль в проблеме, но все работало некоторое время после обновления, поэтому не уверен.

Nspire
источник
0

посмотрите в свой файл BundleConfig.cs строки, которые вызывают IncludeDirectory ()

то есть:

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

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

RolandoCC
источник
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"));
goddy
источник
0

Ни один из этих ответов не помог мне, поскольку я создавал свои jsxфайлы странным образом. Мой код работал в режиме localhost, но не работал в продакшене.

Для меня исправление заключалось в том, чтобы войти в csprojфайл и изменить пути <None ...к файлам с на<Content ...

JacobIRR
источник
0

В основном трассировка стека дает вам точное место (как показано на скриншоте), в котором вам нужно удалить несуществующий ресурс.

изображение, показывающее трассировку стека

Sandeep Talabathula
источник