我在MVC 3.0项目中遇到了这个奇怪的间歇性错误 当我构建项目时,有时会收到以下错误消息:
无法识别的属性'xmlns:xdt'。请注意,属性名称是 区分大小写的。
这是指标准的web.config转换文件(下面复制了Web.Release.config) 没有其他错误或警告。这是在调试模式和发布中发生的。 如果我清理解决方案,有时它会清除
BEGIN UPDATE
发现了这个问题。在MVC项目文件(MyProject.csproj)中,我将构建视图设置为true
<MvcBuildViews>true</MvcBuildViews>
一旦回到 false ,上述错误就会消失。我想建立视图,因为它停止了很多愚蠢的视图代码错误等,并且是性能增强(页面是预编译而不是jit)
任何人都知道这是导致错误的原因吗?这是一个错误吗?
END UPDATE
<?xml version="1.0"?>
<!-- For more information on using Web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<!--
In the example below, the "SetAttributes" transform will change the value of
"connectionString" to use "ReleaseSQLServer" only when the "Match" locator
finds an atrribute "name" that has a value of "MyDB".
<connectionStrings>
<add name="MyDB"
connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
-->
<system.web>
<compilation xdt:Transform="RemoveAttributes(debug)" />
<!--
In the example below, the "Replace" transform will replace the entire
<customErrors> section of your Web.config file.
Note that because there is only one customErrors section under the
<system.web> node, there is no need to use the "xdt:Locator" attribute.
<customErrors defaultRedirect="GenericError.htm"
mode="RemoteOnly" xdt:Transform="Replace">
<error statusCode="500" redirect="InternalError.htm"/>
</customErrors>
-->
</system.web>
</configuration>
答案 0 :(得分:78)
我遇到了同样的问题。 你会发现很多与MvcBuildViews有关的戏弄和各种错误条件。 但似乎没有人提到这个特殊的错误。 一个对我有用的快速修复是删除受影响的Web项目的“obj”目录的内容,然后重建。
答案 1 :(得分:31)
这是一种解决方法,但您可以在预构建命令中添加以下行:
del $(ProjectDir)obj\* /F /S /Q
右键单击您的项目&gt;属性&gt;构建活动&gt;预生成
答案 2 :(得分:9)
这适用于持续集成和WebDeploy:
我设置
的那一刻就会出现此问题<MvcBuildViews>true</MvcBuildViews>
在我的项目文件中,我需要来做。
在阅读并测试了我发现的关于这个问题的所有内容后,我有一个wokraround,也可以通过MSBuild与WebDeploy一起使用
MSBUild.exe ... /p:DeployOnBuild=true
您(仅)需要在构建前和构建后事件期间删除构建文件夹中的TransformWebConfig子文件夹。它甚至可以与持续集成服务器一起使用,如果没有文件夹则会中断
预构建事件命令行:
if exist "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\" del "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\*" /F /S /Q
构建后事件命令行:
if exist "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\" del "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\*" /F /S /Q
如果删除整个Resharper
文件夹,这对obj
工作正常,有时会混淆。
务必将Run the post-build event
设置为always
!!
<强>更新强> 用$(ConfigurationName)替换了调试和发布,并删除了生成的重复行
答案 3 :(得分:1)
我通过做与约伯所说的相同的事情来解决我的冲突。删除属性
xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"
从主Web.config中将其保留到Web.debug.config和Web.release.config
答案 4 :(得分:1)
Microsoft团队还有另一种解决方法。详情请见here。
只需将此代码段复制粘贴到.csproj或.vbproj文件中即可:
<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>
这将使清洁过程自动化[obj&#39;使用Build Targets的文件夹。
答案 5 :(得分:0)
我发现这对我来说效果更好:
del "$(ProjectDir)obj\*" /F /Q
del "$(ProjectDir)obj\$(ConfigurationName)\AspnetCompileMerge\*" /F /S /Q
del "$(ProjectDir)obj\$(ConfigurationName)\CSAutoParameterize\*" /F /S /Q
del "$(ProjectDir)obj\$(ConfigurationName)\Package\*" /F /S /Q
del "$(ProjectDir)obj\$(ConfigurationName)\ProfileTransformWebConfig\*" /F /S /Q
del "$(ProjectDir)obj\$(ConfigurationName)\TempPE\*" /F /S /Q
del "$(ProjectDir)obj\$(ConfigurationName)\TransformWebConfig\*" /F /S /Q
否则建立抱怨edmxResourcesToEmbed
消失。
答案 6 :(得分:0)
只需从web.config中删除xmlns:xdt属性,但将其保存在web.release.config和web.debug.config中。
您的转型仍然有效 - 您的网站也将如此。
答案 7 :(得分:0)
我也见过这个。具体来说,在Visual Studio中的构建配置之间进行更改时,它是可重现的。
我之前的解决方法是删除\obj
文件夹中的所有内容,但仔细检查完web.config之后,我发现它有一些错误的文本位于元素之外(即它是无效的XML)。
看起来配置转换只是在尝试执行转换时吞下了异常。
修正了我的web.config有效,现在一切正常。
希望这有助于某人
答案 8 :(得分:0)
我也遇到过这个问题。对我来说,这是因为我创建了一个名为&#34; DevDebug&#34;的新调试配置。我通过复制web.debug.config来修复它,名为web.DevDebug.config并将其添加到项目中。
然后,当我尝试运行aspnet编译器时,它很满意它可以找到要合并的配置文件的正确配置版本。
答案 9 :(得分:0)
我只需在web.config上更改
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
到
<configuration>
解决了问题
答案 10 :(得分:0)
如果您使用的是visual studio publish,这将阻止web.debug.config / web.release.config将文件注入web.config。