可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm getting this strange intermitent bug in a MVC 3.0 project
When I build the project sometimes I get the following error message:
Unrecognized attribute 'xmlns:xdt'. Note that attribute names are
case-sensitive.
This is referring to the standard web.config tranformation file (Web.Release.config copied below)
There are no other errors or warnings. This is happening in debug mode and release.
Sometimes it clears if I clean the solution
BEGIN UPDATE
Found the issue. In the MVC Project file (MyProject.csproj) I had set build views to true
<MvcBuildViews>true</MvcBuildViews>
Once put back to false the above error goes away. I'd like to have the view build as it stops alot of stupid view code errors etc and is a performance enhancement (pages are precompiled instead of jit)
Anyone know what this is causing the error? is this a bug?
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>
回答1:
I ran into the very same problem.
You will find lots of banter out there related to MvcBuildViews and various error conditions.
But none seem to mention this particular error.
A quick fix that worked for me was to delete the contents of the "obj" directory for the affected web project, then rebuild.
回答2:
This is kind of a workaround, but you may add the following line to your pre-build commands:
del $(ProjectDir)obj\* /F /S /Q
Right click your project > Properties > Build Events > Pre-build
回答3:
This works with Continuous Integration and WebDeploy:
This problem occurs the moment I set
<MvcBuildViews>true</MvcBuildViews>
in my Project file, which I need to do.
After reading and testing everything I found about this problem I have a wokraround, that also works with WebDeploy via MSBuild
MSBUild.exe ... /p:DeployOnBuild=true
You (only) need to delete the TransformWebConfig subfolder in your buildfolder during the pre- AND post-build events. It even works with continuous integration servers which break if no folder exists
Pre-build event command line:
if exist "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\" del "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\*" /F /S /Q
Post-build event command line:
if exist "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\" del "$(ProjectDir)obj\$(ConfigurationName)\transformwebconfig\*" /F /S /Q
This even works fine with Resharper
which will sometimes get confused, if you delete the whole obj
folder.
Make sure to set the Run the post-build event
to always
!!
UPDATE:
Replaced debug and release with $(ConfigurationName) and removed resulting duplicate line
回答4:
I resolve my conflict by doing the same thing that Job said. Removing the attribute
xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"
From the main Web.config and leave it into the Web.debug.config and Web.release.config
回答5:
There is another workaround from Microsoft Team. See details here.
Just copy-paste this snippet into your .csproj or .vbproj file:
<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>
This will automate the process of cleaning 'obj' folder using Build Targets.
回答6:
I've found this works better for me:
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
otherwise build(s) complain about edmxResourcesToEmbed
disappearing.
回答7:
I have seen this too. Specifically, it had been reproducible when changing between build configurations in Visual Studio.
My workaround previously had been to delete everything in the \obj
folder, but after going through my web.config closely, I found it had some erroneous text sitting outside an element (i.e. it was invalid XML).
Seemingly the config transforms was just swallowing up an exception when trying to perform the transformation.
Fixed up my web.config to be valid, and all is working as expected now.
Hope this helps someone
回答8:
I've also run into this issue. For me it was caused by my having created a new debug configuration called, "DevDebug". I fixed it by making a copy the web.debug.config, named web.DevDebug.config and added it to the project.
Then, when I attempted to run the aspnet compiler, it was satisfied that it could find the right configuration version of the config file to merge in.
回答9:
I just change below on web.config
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
to
<configuration>
It fixed the problem
回答10:
- Right click on the project, click Publish
- Goto Settings -> File Publish Options
- Uncheck Precompile during publishing
This will prevent the web.debug.config/web.release.config injecting the file back to the web.config if you are using visual studio publish.
回答11:
just remove the xmlns:xdt attribute from the web.config, but keep it in web.release.config and web.debug.config.
Your transform will still work - and so will your website.