103

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

但是如果我已经构建了它,我不能发布它!我必须清理解决方案并再次发布。我知道这不是系统关键,但这真的很烦人。“一键发布”不是“清理解决方案,然后一键发布”

确切的错误如下:

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

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

4

10 回答 10

76

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

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

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

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

FWIW,MS知道这个错误......

于 2010-05-19T05:06:12.467 回答
40

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

<MvcBuildViews>true</MvcBuildViews>

我的项目文件中的选项(与 T4MVC T4 模板一起使用)。

编辑:这可以通过简单地使用“构建”->“重建解决方案”菜单来实现(因为重建实际所做的是清除 obj/Debug 文件夹,然后构建解决方案)。

于 2010-10-22T16:04:19.950 回答
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>
于 2011-04-07T17:53:11.850 回答
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.config,以及 \obj 下的所有 PackageTmp 文件夹。

于 2013-02-09T19:37:16.560 回答
4

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

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

于 2012-11-22T03:16:12.323 回答
3

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

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

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

因此,请确保如果您正在更改您的 csproj 文件,您也可以更改或删除“.csproj.user”文件。

于 2013-02-06T05:46:34.490 回答
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

于 2012-10-12T09:50:00.697 回答
1

我也遇到了这个问题,所以我在项目属性中创建了一个 Pre-Build Event 来清理输出目录(${projectPath}\bin,${projectPath}\obj\${ConfigurationName})。在另一个项目中,即使进行了清洁活动,我也遇到了这个错误。在第二个项目中,我正在编译项目文件中列出的视图:

<MvcBuildViews>true</MvcBuildViews>

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

于 2010-04-23T18:29:43.453 回答
0

问题与中间文件有关,但还有另一种解决方案,即在构建视图之前清理这些中间文件。

此解决方案已包含在某些版本的 VS 中,但我只能说我在 VS 2013 Update 5 中遇到了问题。(请参阅下面的“注意”,它可以在此版本中修复,但仅适用于我的特定非标准案例)。

我从错误中借用了解决方案:allowDefinition='MachineToApplication' 在 Visual Studio Connect 上超出应用程序级别。

解决方案包括将这些行包含到.csproj处理违规中间文件的删除的 Web 应用程序项目(文件)中:

<!--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>
于 2016-10-21T11:24:18.730 回答
0

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

所以我删除了 PrecompileDuringPublish 并且该解决方案对我有用,从那以后我就没有遇到过这个问题。

在此处输入图像描述

于 2016-12-30T06:53:11.960 回答