从VS2010发布时,allowDefinition ='MachineToApplication'错误(但仅在上一次构建之后)

时间:2010-04-02 10:47:34

标签: asp.net-mvc web-deployment one-click-web-publishing

我可以在本地计算机上运行我的Asp.Net MVC 2应用程序而不会出现问题。只需运行/调试。

但如果我已经建成它,我就无法发布它!我必须清理解决方案并再次发布。我知道这不是系统关键,但它真的很烦人。 “单击发布”不是“清洁解决方案,然后单击发布”

确切的错误如下:

  

错误11使用a时出错   注册为的部分   allowDefinition的= 'MachineToApplication'   超出应用水平。这个错误   可以由虚拟目录引起   未配置为应用程序   在IIS中。

我怀疑它与Views文件夹中的Web.Config有关,但之后为什么只有在我之前构建过一次之后。请注意,该应用程序一旦发布就可以正常工作。

10 个答案:

答案 0 :(得分:76)

我的MVC应用程序遇到了同样的问题。这令人沮丧,因为我仍然想要检查我的观点,所以我不想关闭 MvcBuildViews

幸运的是,我遇到了post给了我答案。将MvcBuildViews保持为 true ,然后您可以在项目文件中添加以下行:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

并使该文件夹不在项目的文件夹中。适合我。这不是一个完美的解决方案,但它现在很好。确保从项目文件夹中删除文件夹(位于 obj \ Debug 和/或 obj \ Release 文件夹中),否则你'我会不断收到错误。

FWIW,MS know about this error ......

答案 1 :(得分:40)

我删除了obj / Debug文件夹中的所有内容,并修复了此错误。这让我可以离开

<MvcBuildViews>true</MvcBuildViews>
我的项目文件中的

选项(使用T4MVC T4模板非常方便)。

编辑: 只需使用“Build” - &gt;即可轻松实现这一目标。 “Rebuild Solution”菜单(因为重建实际上做的是清除obj / Debug文件夹,然后构建解决方案)。

答案 2 :(得分:26)

我在MS Connect页面上使用此解决方法来解决此错误。它在运行AspNetCompiler之前清除项目下的所有obj和temp文件(所有配置)。

  

修改MvcBuildViews目标   你的项目文件,这取决于它   在清理目标的目标上   打包Visual Studio所拥有的文件   创建。这些目标包括在内   Web应用程序项目   自动。

     

将删除所有包装文件   每次都是MvcBuildViews   目标执行。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>

答案 3 :(得分:24)

当obj文件夹中存在Web项目输出(模板化web.config或临时发布文件)时,会发生此问题。使用的ASP.NET编译器不够智能,无法忽略obj文件夹中的内容,因此会抛出错误。

另一个解决方法是在调用&lt; AspNetCompiler&gt;之前核对发布输出。打开你的.csproj并改变它:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

到此:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <ItemGroup>
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
  </ItemGroup>
  <Delete Files="@(ExtraWebConfigs)" />
  <RemoveDir Directories="@(ExtraPackageTmp)" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

这将删除\ obj下的所有web.configs,以及\ obj下的所有PackageTmp文件夹。

答案 4 :(得分:4)

如果您使用的是Web Publish,则可以设置MvcBuildViews=falsePrecompileBeforePublish=true,它们在复制到临时文件夹之后(在发布/包之前)进行预编译。

注意:PrecompileBeforePublish仅受“新”Web发布管道堆栈(VS2010 SP1 + Azure SDK或VS2012 RTM)支持。如果您使用的是VS2010 RTM,则需要使用其中一种替代方法。

答案 5 :(得分:3)

关于jrummell的解决方案,设置:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

适用于VS 2010 ,但不适用于VS 2012 。在2012年你必须把:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

来源:

VS 2010: C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets

VS 2012: C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.targets

答案 6 :(得分:3)

我知道这已经得到了解答,但我只想添加一些有趣的东西。

我在项目中将“MvcBuildViews”设置为false,删除了所有bin和obj文件夹,但我仍然收到错误。我发现有一个“.csproj.user”文件仍然将“MvcBuildViews”设置为true。

我删除了“.csproj.user”文件,然后一切正常。

因此,请确保您更改的csproj文件是否也要更改或删除“.csproj.user”文件。

答案 7 :(得分:2)

我也有这个问题,所以我在项目属性中创建了一个预构建事件来清理输出目录(${projectPath}\bin,${projectPath}\obj\${ConfigurationName})。在另一个项目中,即使清洁事件到位,我也会收到此错误。在第二个项目中,我正在编译项目文件中列出的视图:

<MvcBuildViews>true</MvcBuildViews>

我将true更改为false,并且不再抱怨该错误,但仍然正确运行。我不会声称我确切知道造成第二次错误的原因,但至少它让我暂时向前推进。

答案 8 :(得分: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属性。我还通过删除PropertyGroup并简化条件来简化目标,如下所示:

  <Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
    <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>

答案 9 :(得分:0)

在我的情况下,我看到当我有MvcBuildViews和PrecompileDuringPublish都是真的时 - 是造成这个问题的原因。

所以我删除了PrecompileDuringPublish,该解决方案对我有用,而且我从未遇到过这个问题。

enter image description here