从VS2010发布时,allowDefinition ='MachineToApplication'错误(但仅在以前的构建之后)


103

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

但是,如果我已经构建了它,就无法发布它!我必须清理解决方案,然后再次发布。我知道这不是系统关键,但确实很烦人。“一键发布”不是“先清除解决方案,然后一键发布”

确切的错误如下:

错误11使用超出应用程序级别注册为allowDefinition ='MachineToApplication'的节是错误的。此错误可能是由于未在IIS中将虚拟目录配置为应用程序引起的。

我怀疑这与Views文件夹中的Web.Config有关,但是为什么只有在我之前构建一次之后才这么做。需要注意的是,该应用一旦发布便可以正常运行。


1
如果子目录中还有多余的web.config,请尝试将其删除。
user1154664

Answers:


76

我的MVC应用程式有相同的问题。这令人沮丧,因为我仍然希望检查我的视图,所以我不想关闭MvcBuildViews

幸运的是,我遇到了一个给我答案的帖子。保持MvcBuildViews为true,则可以在项目文件下面添加以下行:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

并使该文件夹不在您项目的文件夹中。为我工作。这不是一个完美的解决方案,但暂时是有益的。确保从项目文件夹中删除了package文件夹(位于obj \ Debug和/或obj \ Release文件夹中),否则将继续收到错误消息。

FWIW,MS知道此错误 ...


1
phil haack对于与2010 SP1 相比
Benpage

3
nb phil在该博客上提供的解决方案对我不起作用。以上解决方案是我唯一的解决方案。
2011年

9
我认为删除obj文件夹是一个更简单的解决方案,并且不太需要记住/维护项目文件中的更改。似乎应该是这里的最佳答案。(截至2011年中)
RyanW

FWIW,此条目实际上更改了发布的中间输出路径(该\obj路径),而不是MvcBuildViews。差异是细微的,但意义重大。
newmanth 2015年

40

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

<MvcBuildViews>true</MvcBuildViews>

选项在我的项目文件中(随T4MVC T4模板一起提供)。

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


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>

为我工作。我还评论了以下目标,以使其正常工作:<Target Name =“ AfterBuild” Condition =“'$(MvcBuildViews)'=='true'”> <AspNetCompiler VirtualPath =“ temp” PhysicalPath =“ $(ProjectDir)” /> < / Target>
kaptan 2011年

更新-MVC 3工具更新应解决此问题。haacked.com/archive/2011/05/09/...
jrummell

3
是的... rmdir /S /Q "$(ProjectDir)\obj"根据Microsoft Ticket 添加到后期版本部分中,解决了该问题!
Leniel Maccaferri'5

在2012年,目标CleanWebsitesPackageTempDir和CleanWebsitesTransformParametersFiles不存在,仍然出现错误。
戴夫2012年

2
@jrummell有趣,当在我的mvc4项目中启用了构建视图时,我收到此MachineToApplication错误,以为它是某种相关的。
戴夫

24

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

另一个解决方法是在调用<AspNetCompiler>之前取消发布输出。打开您的.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文件夹。


加我所有的赞成票。obj文件夹里有碎屑。
ta.speot.14年

编辑者抱怨里面的元素<ItemGroup>是无效的,但是忽略了它-无论如何仍然有效。
Kjell Rilbe

效果很好,让我免于每次想将配置从调试切换到发布时都删除obj文件夹的麻烦
Todd Skelton

4

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

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


我看不到此解决方案可以构建视图。我故意在我的视图中放置一个错误,并设置PrecompileBeforePublish = True,它没有使构建失败。(我使用的是VS2012)
Hullah 2013年

这为我在VSO版本中工作的问题解决了,我尝试使用/ p:PrecompileBeforePublish = true进行预编译
Stephen McDowell,

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


3

我知道已经回答了,但是我只想添加一些有趣的东西。

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

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

因此,请确保如果要更改csproj文件,则还要更改或删除“ .csproj.user”文件。


1

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

<MvcBuildViews>true</MvcBuildViews>

我将true更改为false,它不再抱怨该错误,但仍然可以正确运行。我不会声称我确切地知道是什么导致了第二个错误,但是至少它使我暂时前进了。


1
谢谢您,但是我不能真正将MvcBuildViews标记为False,因为它有助于在我部署之前解决问题。

0

问题与中间文件有关,但是还有另一种解决方案,其中包括在建立视图之前清理那些中间文件。

该解决方案已被列入某些版本的VS,但我只能说,我在VS有问题2013更新5.(参见“小心”下面,它可以被固定在这个版本,但不只是在我的特殊工作非标准案例)。

我从错误中借了解决方法:allowDefinition ='MachineToApplication',超出了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>

0

就我而言,我看到当我同时将MvcBuildViews和PrecompileDuringPublish都设置为true时,才是导致此问题的原因。

因此,我删除了PrecompileDuringPublish,该解决方案为我工作了,此后我再也没有遇到过这个问题。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.