在我的Asp.Net MVC 4项目中,我已经在.csproj文件中进行了设置,以构建<MvcBuildViews>true</MvcBuildViews> View 。问题是在构建项目时出现错误:
It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.
我试图删除obj文件夹,但错误不断出现。该错误表明问题出在身份验证标签行中:

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>

通常,我可以通过运行应用程序(出现错误),构建应用程序并随后再次运行来运行该应用程序。

最佳答案

进行@matrixugly建议可以解决此问题,但也会导致编译时 View 检查也停止工作。我假设您仍要在编译时对 View 进行错误检查?如果是这种情况,请在下面进行更好的修复。

为了了解为什么这些解决方案有效,我们必须首先知道问题是如何产生的:

  • 开发人员希望对 View 进行编译时检查,因此他们设置了MvcBuildViews=true
  • 应用程序可以正常运行,直到他们发布项目为止。
  • 随后尝试构建项目会导致编译时错误:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

  • 那是什么原因导致这个问题呢?发布项目时,编译器默认情况下会使用<project-dir>\obj\放置将与之一起使用的源文件的副本。不幸的是,这些文件在发布完成后不会自动删除。下次开发人员使用MvcBuildViews=true编译项目时,它将出错,因为aspnet编译器在编译过程中包括obj\文件夹,因为它位于<project-dir>文件夹下面。

    那么我们该如何解决呢?好吧,您有四个选择:
  • 设置MvcBuildViews=false。我真的不认为这是一个解决方案,所以让我们继续。
  • 删除<project-dir>\obj\中的文件。可行,但可能会很麻烦,因为必须在每次发布后进行。
  • 通过使用项目配置文件中的<BaseIntermediateOutputPath>属性来更改发布用作中间目录的路径。示例(引用:this link):
    <BaseIntermediateOutputPath> [SomeKnownLocationIHaveAccessTo] </BaseIntermediateOutputPath>
  • 在项目配置文件中添加一个新部分,该部分将在构建时为您删除有问题的文件(引用Microsoft Connect)。我什至简化了您的工作,只需复制并粘贴即可:
    <PropertyGroup>
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
    </PropertyGroup>
    <Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
    <ItemGroup>
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\Package\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\TransformWebConfig\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\CSAutoParameterize\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\TempPE\**\*" />
    </ItemGroup>
    
    <Delete Files="@(_TempWebConfigToDelete)"/>
    </Target>
    

  • 我的建议是使用选项3或4。

    N.B.对于从未编辑过项目文件的用户,在加载时无法对其进行编辑。首先必须通过右键单击并选择Unload Project卸载它。然后,您可以右键单击项目并编辑项目文件。或者,您可以在Visual Studio外部编辑文件。

    09-27 04:41