allowDefinition ='MachineToApplication'msbuild错误

时间:2011-03-11 09:46:53

标签: msbuild web-config

我们有一个带有4-5种不同构建配置的ASP.NET MVC。每当我们更改构建配置时,我们都需要删除web项目的obj文件夹,因为我们得到'allowDefinition ='MachineToApplication'错误。一个痛苦,但我们通过删除前/后构建事件中的文件夹来管理。 现在我需要配置我们的CI来构建部署包。这意味着我无法删除obj文件夹。每次我编译,例如使用以下msbuild参数

  

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

我收到错误:

  

web.config(123):错误ASPCONFIG:在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的部分是错误的。此错误可能是由于虚拟目录未在IIS中配置为应用程序。

据我所知,问题是项目中有多个.config文件 - 在我们的例子中,没有。我真的可以使用一些帮助找到解释并找到一个永久性(无法修复)。

编辑: 这个问题被标记为重复,但是2个主题中的相应答案和原因明显不同。不确定这个标签的用途是什么 - 我在发布这个问题之前已经阅读过该特定帖子,因为它没有回答我的问题。导致此错误消息的原因有多种。它是“相似的”,但绝对不是重复的!

12 个答案:

答案 0 :(得分:22)

SO上有一个类似的question,为这个问题提供了一些很好的解决方案。

问题是构建部署包会在/ obj的子文件夹中创建web.config的副本。如果你进行重建或清理,通常会被清除。但是,如果您在一个配置(例如Debug)中构建部署包,然后切换到另一个配置(例如Release),则不会清除obj / Debug文件夹,并且web.config文件会导致问题。

快速解决方案是清除所有配置,然后执行(重新)构建。或者,您可以删除项目中的/ obj文件夹。 要永久解决问题,您可以将中间输出(/ obj)移出项目文件夹,也可以修改项目以强制清除重建时的所有配置。

答案 1 :(得分:21)

我也删除了obj文件夹,直到我与需要它的构建脚本发生冲突。 Catch-22,我在下面的SO链接上使用了接受的答案将Obj文件夹的位置移动到C:\Temp\BUILD。你必须按照csproj文件来做,但这是一个很好的解决方案。

以下是链接:VisualStudio: How to save the obj folder somewhere else

请注意,我正在为项目名称使用变量。 R:\ TEMP \生成\调试\ $(MSBuildProjectName)

我在所有项目的调试和发布部分都有上述代码,包括类项目。我的构建路径是速度的ram驱动器。有关详细信息,请参阅此SO:How to access macro variables within csproj file?

答案 2 :(得分:12)

我刚刚回答了类似的问题here。回顾一下,我在一个MVC项目中遇到了这个问题,这是因为项目文件中的MvcBuildViews属性设置为true。将属性设置为false可以解决问题。

<MvcBuildViews>false</MvcBuildViews>

我还发现this answer概述了一种不需要关闭视图构建的替代方案。

答案 3 :(得分:2)

我不知道有一个“官方”修复,因为它似乎从我的多个项目开始,我无法在Visual Studio Premium 2012中找到(在以前版本的VS中从未发生过)。 / p>

正如其他人所说的那样,自动删除obj目录,类似于用户在这篇文章VisualStudio: How to save the obj folder somewhere else中的回答,遗憾的是只是移动obj文件夹的位置并不总是似乎工作。

相反,我在Pre-build事件命令行中的Build Events下添加了一些命令:

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

您可以使用buildConfigName与您正在使用的构建配置的名称相匹配的行来更改/添加/删除子文件夹以匹配您的自定义构建配置:

md "$(ProjectDir)obj\buildConfigName"

希望这有帮助!

答案 4 :(得分:1)

该错误表示您正在尝试在IIS树级别上未定义为应用程序的应用程序特定的内容。例如,如果您尝试在虚拟目录中的web.config中执行应用级功能,则会收到该错误。您需要找到要部署到的路径,并确保它在IIS中定义为应用程序与文件夹或vdir。

答案 5 :(得分:1)

清理解决方案(右击VS中的解决方案,清理),对我有用。

答案 6 :(得分:1)

我遇到了同样的错误,但是部署了一个页面..然后我意识到我的网络服务器的时钟由于某种原因被设置回2010年。将其设置为正确的日期修复我的问题

答案 7 :(得分:0)

这不一定是完全相同的问题,说实话,可能归结为我的纯粹缺乏知识,但是我在以下情况下遇到同样的错误:

  1. 我设置了一个标准的asp.net新项目,实际上只是用于HTML5的东西,所以除了通常的项目结构之外别无其他
  2. 然后我(不想也许!)添加了一个新的WCF REST项目(实际上它只是另一个基础的asp.net项目,使用了来自http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call?fid=1597004&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Quick&fr=26#xx0xxhttp://geekswithblogs.net/michelotti/archive/2010/08/21/restful-wcf-services-with-no-svc-file-and-no-config.aspx的非常好的例子
  3. 问题是我将WCF REST项目(#2)添加为主项目(#1)的SUB-DIRECTORY,然后尝试构建!即使我当然清理了项目..我也使两个项目都使用IISexpress,因为我认为使用相同的端口或其他东西存在问题。

    当然,构建过程从#1看到web.config,然后看到另一个web.config#2的子目录。

    我意识到这应该是一个非常基本的理解 gotcha 并且它在一段时间之前引起了我的注意,但是有时它是最简单的错误,真是一种痛苦!

    可能会帮助别人......也许他们早上没有咖啡..

答案 8 :(得分:0)

提示1:清洁&amp;然后重建。

提示2:关闭VS并再次打开。

提示3:下载的项目可能在另一个子文件夹中...打开包含.net文件的文件夹。

c:/ demo1 / demo /(所有文件)

您必须从vs ...而不是demo1打开演示。

答案 9 :(得分:0)

清理您的项目 删除/ obj文件夹(可能使用发布和部署? - 其中有一个错误)

答案 10 :(得分:0)

我有一个类似的问题,我把主配置作为始终复制,所以它将配置复制到bin目录。当我重新发布主项目时,我得到了MachineToApplication错误。所以我的解决方案是将配置更改为不复制并删除bin文件夹中的额外配置。

答案 11 :(得分:0)

虽然问题在接受的答案中以一种方式解释和解决,但我想展示一个对其他案例更好的解决方案。此解决方案已包含在VS的某个版本中,但我只能说我在VS 2013 Update 5中遇到了问题。(请参阅下面的“Beware”,它可以在此版本中修复,但不能仅在我的特定情况下工作。)

我从Error: allowDefinition='MachineToApplication' beyond application level on Visual Studio Connect.

借用了解决方案

解决方案包括将这些行包含在Web应用程序项目(.csproj文件)中,该项目处理中断文件的删除(这不是解决接受的答案,因为他需要那些中间文件):

<!--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属性。