在我的Asp.Net MVC 4项目中,我设置了.csproj文件来构建视图<MvcBuildViews>true</MvcBuildViews>
。问题是构建项目我得到了错误:
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>
通常,我可以通过运行应用程序(我收到错误),构建应用程序以及之后再次运行来运行应用程序。
答案 0 :(得分:7)
执行@matrixugly建议将解决问题,但也会导致编译时视图检查也停止工作。我假设您仍然希望在编译时错误检查您的视图?如果是这种情况,请在下面进行更好的修复。
为了理解这些解决方案的工作原理,我们必须首先了解问题是如何产生的:
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外部编辑文件。
答案 1 :(得分:0)
在启用MvcBuildViews验证我的Razor语法后尝试发布我的Web应用程序时遇到了完全相同的问题
我在网络配置中找到了这段代码
<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
尝试将其注释掉,以便不改变编译器行为
<!--<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>-->