如何阻止Visual Studio Web将web.config写入/ obj目录

时间:2014-05-03 11:54:08

标签: asp.net-mvc visual-studio-2013 msdeploy

我正在使用MSDeploy(Web Deploy)来发布我的MVC应用程序,这非常有用。唯一的问题是它将所有已编译的文件以及额外的web.config放在obj目录中,因此下次我尝试构建时会出现以下错误:

Error   1   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,问题就会消失,但这很烦人。我可以为我做一个后期构建任务,但感觉不对。不应该有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我假设您在Visual Studio中构建期间使用MvcBuildViews编译您的站点,因为在发布期间预编译的默认行为是将站点内容复制到临时文件夹并预编译该文件夹(以避免像obj或其他排除的文件。)

最简单的解决方法(记录为here)是将您的obj目录重新定位到其他位置,如下所示:

<BaseIntermediateOutputPath>Somewhere\Not\Under\Project\Directory</BaseIntermediateOutputPath>

更长的解释:

MvcBuildViews在项目文件中调用ASP.NET编译器:

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

默认情况下,编译器将编译指定的根文件夹下的站点的所有内容。该错误源于obj\web.config包含仅在站点根web.config中允许的内容时(因为它是从中复制的位置)。

其他2种解决方法:

  1. 不要使用MvcBuildViews。自从Web部署项目were dropped支持为所有Web项目本地支持WebDeploy之后,您可以在发布之前配置预编译。这确实会丢失编译器检查每个构建。
  2. 从.NET 4.5开始,aspnet_compiler.exe现在支持-x标志,以从预编译中排除特定目录。不幸的是,这个标志从未进入过AspNetCompilerTask,所以你必须改写目标来调用编译器并自己传递任何必要的参数。

答案 1 :(得分:0)

我有我的web.config属性&#34;复制到输出目录&#34;设置为&#34;始终复制&#34;。将其设置回&#34;不要复制&#34;为我解决了。