AllowDefinition = 'MachineToApplication' msbuild error

У нас есть ASP.NET MVC с 4-5 различными конфигурациями сборки. Всякий раз, когда мы меняем конфигурацию сборки, нам нужно удалить папку obj для веб-проекта, так как мы получаем ошибку allowDefinition = MachineToApplication. Боль, но нам удалось удалить папку в событиях pre/post build. Теперь мне нужно настроить наш CI для создания пакетов развертывания. Это означает, что я не могу удалить папку obj. Каждый раз, когда я компилирую, например, со следующими параметрами msbuild

/p: CreatePackageOnPublish = true/p: DeployOnBuild = true

Получаю ошибку:

web.config(123): ошибка ASPCONFIG: Ошибка использования раздела, зарегистрированного как allowDefinition = 'MachineToApplication', превышающего уровень приложения. Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

Насколько я понимаю, проблема в том, что в проекте есть несколько файлов .config. В нашем случае нет. Я действительно мог бы использовать некоторую помощь, чтобы найти объяснение и найти постоянное (no-hack) исправление.

Изменить: Этот вопрос отмечен как дубликат, но соответствующие ответы и причины (причины) в 2 потоках явно отличаются друг от друга. Не уверен, что предназначено для этого тега. Я прочитал этот конкретный пост, прежде чем публиковать этот вопрос, так как он не ответил на мой вопрос. Существует несколько причин для этого сообщения об ошибке. Это "похоже", но определенно не дубликат!

Ответ 1

Я тоже удалял папку obj, пока не столкнулся с конструкцией script, которая требовала его. Catch-22, я использовал принятый ответ на следующей ссылке SO, чтобы переместить местоположение папки Obj в C:\Temp\BUILD. Вы должны сделать это в файле csproj, но это отличное решение.

Вот ссылка: VisualStudio: как сохранить папку obj в другом месте

Обратите внимание, что я использую переменную для имени проекта. R:\Temp\Сложение\Debug\$(MSBuildProjectName)

У меня есть вышеуказанная строка в обоих разделах отладки и выпуска для всех моих проектов, включая проекты классов. Мой путь сборки - это привод для скорости вращения. См. Это SO для получения дополнительной информации: Как получить доступ к макропеременным в файле csproj?

Ответ 2

Существует аналогичный вопрос здесь, на примере SO с некоторыми хорошими решениями для этой проблемы.

Проблема заключается в том, что при создании пакета развертывания создается копия web.config в подпапке /obj. Обычно это будет очищено, если вы выполните восстановление или очистку. Однако, если вы создаете пакет развертывания в одной конфигурации (например, Debug), а затем переключитесь на другую конфутацию (например, Release), папка obj/Debug не будет очищена, и файл web.config там будет иметь проблемы.

Быстрое решение - очистить все конфигурации, а затем выполнить (re) сборку. Кроме того, вы можете удалить папку /obj в своем проекте. Чтобы окончательно решить проблему, вы можете либо переместить промежуточный вывод (/obj) из папки проекта, либо изменить проект, чтобы принудительно удалить все конфигурации при восстановлении.

Ответ 3

Я просто ответил на аналогичный вопрос здесь. Чтобы повторить, я столкнулся с этой проблемой в одном из наших MVC-проектов, и это связано с тем, что свойство MvcBuildViews в файле проекта установлено на true. Установка свойства в false устраняет проблему.

<MvcBuildViews>false</MvcBuildViews>

Я также нашел этот ответ, в котором излагается альтернатива, которая не требует отключения структуры просмотра.

Ответ 4

Я не знаю, что существует "официальное" исправление, поскольку оно просто начиналось с нескольких моих проектов без каких-либо оснований, которые я могу найти в Visual Studio Premium 2012 (никогда не было в предыдущих версиях VS).

Как работа для автоматизации удаления каталога obj, как говорили другие, аналогично ответу пользователя Casual в этом сообщении VisualStudio: как сохранить папку obj в другом месте, где, к сожалению, просто перемещение местоположения папки obj не всегда срабатывало.

Вместо этого я добавил несколько команд в "События сборки" в командной строке события Pre-build:

rd "$(ProjectDir)obj" /S /Q
md "$(ProjectDir)obj"
md "$(ProjectDir)obj\Debug"
md "$(ProjectDir)obj\Release"

Вы можете изменить/добавить/удалить вложенные папки в соответствии с вашими конфигурациями сборки, используя строку, где buildConfigName соответствует имени используемой конфигурации сборки:

md "$(ProjectDir)obj\buildConfigName"

Надеюсь, это поможет!

Ответ 5

Эта ошибка указывает на то, что вы пытаетесь что-то конкретное для приложения на уровне дерева IIS, которое не определено как приложение. Например, если вы попытаетесь выполнить функции уровня приложения в файле web.config в виртуальном каталоге, вы получите эту ошибку. Вам нужно найти путь, к которому вы развертываете, и убедиться, что он определен в IIS как приложение или папка или vdir.

Ответ 6

Очистка решения (щелкните правой кнопкой мыши Solution in VS, clean), работал у меня.

Ответ 7

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

Ответ 8

Это не обязательно то же самое, и, честно говоря, возможно, вплоть до чистого недостатка знаний с моей стороны, однако у меня была такая же ошибка, когда:

Проблема заключалась в том, что я добавил проект WCF REST (# 2) в качестве СУБ-КАТАЛОГ основного проекта (№1), а затем попытался построить! даже если бы я очистил проект, конечно.. Я также сделал оба проекта использовать IISexpress, потому что я думал, что есть проблема с использованием того же порта или что-то в этом роде.

Конечно, процесс сборки увидел web.config из # 1, а затем под-dir с другим web.config # 2..

Я понимаю, что это, вероятно, должно быть очень понятным пониманием, и оно меня давно поймало, однако иногда это самые простые ошибки, которые являются настоящей болью.

Может помочь другим... кто, возможно, не имел утреннего кофе..

Ответ 9

tip 1: очистить и затем восстановить.

tip 2: просто закройте VS и снова откройте.

tip 3: загруженный проект может находиться внутри другой подпапки... открыть папку, в которой есть .net файлы.

c:/demo1/demo/(все файлы)

Вам нужно открыть демоверсию vs... not demo1.

Ответ 10

Очистите свой проект Удалите папку /obj (возможно, используя публикацию и развертывание?), В ней есть ошибка)

Ответ 11

У меня есть аналогичная проблема, у меня была основная конфигурация как Copy Always, поэтому она скопировала конфигурацию в каталог bin. Когда я переиздал основной проект, я получил ошибку MachineToApplication. Поэтому я решил просто изменить конфигурацию на Не копировать и удалить дополнительную конфигурацию в папке bin.

Ответ 12

Althoug проблема объясняется и решается одним способом в принятом ответе, я хотел показать решение, которое может быть лучше для других случаев. Это решение было включено в некоторую версию VS, но я могу только сказать, что у меня была проблема в обновлении VOS 2013 г. 5. (См. Ниже "Осторожно", это может быть исправлено в этой версии, но не работает только в моем конкретном случай).

Я заимствовал soltuion из Ошибка: allowDefinition = 'MachineToApplication' за пределами уровня приложения в Visual Studio Connect.

Решение состоит в том, чтобы включить эти строки в проект веб-приложения (.csproj file), который обрабатывает удаление промежуточных файлов offedning (что не является решением для принятого ответа, поскольку ему нужны эти промежуточные файлы):

<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level, 
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
    <ItemGroup>
     <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
    </ItemGroup>
    <!--Force msbuild to expand all the wildcard characters so to get real file paths-->
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
     <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
    </CreateItem>
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>

Остерегайтесь: по какой-то причине, вероятно, потому, что я включил его сам в проект, моя цель сборки для создания представлений была названа "BuildViews" вместо "MvcBuildViews", поэтому мне пришлось изменить атрибут BeforeTargets.