44

我在 MVC 3.0 项目中遇到这个奇怪的间歇性错误当我构建项目时,有时我会收到以下错误消息:

无法识别的属性“xmlns:xdt”。请注意,属性名称区分大小写。

这是指标准的 web.config 转换文件(Web.Release.config 复制在下面)没有其他错误或警告。这发生在调试模式和发布中。有时,如果我清理解决方案,它就会清除

开始更新

发现问题。在 MVC 项目文件(MyProject.csproj)中,我将构建视图设置为 true

<MvcBuildViews>true</MvcBuildViews>

一旦放回,上述错误就会消失。我想要构建视图,因为它可以阻止很多愚蠢的视图代码错误等,并且是一种性能增强(页面是预编译而不是 jit)

任何人都知道这是导致错误的原因吗?这是一个错误吗?

结束更新

<?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>
4

11 回答 11

78

我遇到了同样的问题。你会发现很多与 MvcBuildViews 和各种错误条件相关的玩笑。但似乎没有人提到这个特殊的错误。一个对我有用的快速修复方法是删除受影响 Web 项目的“obj”目录的内容,然后重新构建。

于 2012-11-16T16:24:17.390 回答
31

这是一种解决方法,但您可以将以下行添加到预构建命令中:

del $(ProjectDir)obj\* /F /S /Q

右键单击您的项目 > 属性 > 构建事件 > 预构建

于 2013-01-11T13:51:36.993 回答
10

这适用于持续集成和 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 eventalways!!

更新: 用 $(ConfigurationName) 替换 debug 和 release 并删除产生的重复行

于 2014-04-10T07:49:58.583 回答
2

我通过做约伯所说的同样的事情来解决我的冲突。删除属性

xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"

从主 Web.config 并离开它进入 Web.debug.config 和 Web.release.config

于 2013-12-20T16:02:13.313 回答
1

只需从 web.config 中删除 xmlns:xdt 属性,但将其保留在 web.release.config 和 web.debug.config 中。

您的转换仍然有效 - 您的网站也是如此。

于 2013-08-27T18:57:34.897 回答
1

Microsoft Team 提供了另一种解决方法。在此处查看详细信息。

只需将此片段复制粘贴到您的 .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”文件夹的过程。

于 2015-12-18T13:47:37.973 回答
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消失。

于 2013-06-21T15:05:08.173 回答
0

我也见过这个。具体来说,在 Visual Studio 中的构建配置之间进行更改时,它是可重现的。

我以前的解决方法是删除\obj文件夹中的所有内容,但是在仔细检查了我的 web.config 之后,我发现它有一些错误的文本位于元素之外(即它是无效的 XML)。

似乎配置转换只是在尝试执行转换时吞噬了一个异常。

将我的 web.config 修复为有效,现在一切都按预期工作。

希望这可以帮助某人

于 2014-08-17T10:42:55.177 回答
0

我也遇到过这个问题。对我来说,这是因为我创建了一个名为“DevDebug”的新调试配置。我通过复制名为 web.DevDebug.config 的 web.debug.config 并将其添加到项目中来修复它。

然后,当我尝试运行 aspnet 编译器时,很满意它可以找到要合并的配置文件的正确配置版本。

于 2015-01-23T02:06:54.677 回答
0

我只是在 web.config 下面更改

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<configuration>

它解决了问题

于 2015-02-12T12:03:13.420 回答
0
  1. 右键单击项目,单击发布
  2. 转到设置->文件发布选项
  3. 在发布期间取消选中预编译

如果您使用的是 Visual Studio 发布,这将防止 web.debug.config/web.release.config 将文件注入回 web.config。

于 2016-02-13T21:18:44.890 回答