【问题标题】:Web.config transformation: Unrecognized attribute 'xmlns:xdt'. Note that attribute names are case-sensitiveWeb.config 转换:无法识别的属性“xmlns:xdt”。请注意,属性名称区分大小写
【发布时间】:2012-09-26 02:55:26
【问题描述】:

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

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

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

开始更新

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

<MvcBuildViews>true</MvcBuildViews>

一旦放回 false,上述错误就会消失。我希望构建视图,因为它可以阻止很多愚蠢的视图代码错误等,并且是性能增强(页面是预编译而不是 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>

【问题讨论】:

  • 上面的web.release.config和MS提供的完全一样
  • 我从未接触过 MvcBuildViews,它默认为 false。这个错误突然出现
  • @AndrewHarry 很高兴将其中一个答案标记为正确,毕竟这段时间 =)
  • @AndreCalil 我会将一个标记为“答案”,但正如你所说,这是很久以前的事了,我不知道哪个是最好的
  • @AndrewHarry 请注意,您假设 MvcBuildViews 可以防止服务器上的“jitting”(或代码生成 + 编译 + jitting 真的)。请注意,它实际上并没有做任何这些事情。它仅有助于验证您的构建。看到这个线程 - stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc

标签: asp.net-mvc-3 web-config


【解决方案1】:

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

【讨论】:

  • 好一个。我正要违背我的意愿将 MvcBuildViews 设置为 false 只是为了摆脱这个错误。谢谢!
  • 男孩,我认为“清洁解决方案”就是这个意思。我猜我错了。
  • 宣布获胜
  • 在 VS 2019 中不适合我。我运行了 Clean 解决方案,我删除了 obj 和 bin,然后运行了 Rebuild All。
【解决方案2】:

这是一种解决方法,但您可以在 pre-build 命令中添加以下行:

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

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

【讨论】:

  • 如果您的项目位于包含空格的路径中,请记住在 $(ProjectDir)obj\* 部分周围加上引号。
  • @MathiasLykkegaardLorenzen 是的,确实。谢谢。
  • @gldraphael 感谢您的反馈,很高兴为您提供帮助
  • 我还必须将其添加为构建后事件以使事情正常运行
  • 这个问题很烦人,因为它并非在每个构建中都会发生。感谢@AndreCalil 按照您的建议为我解决了这个问题!
【解决方案3】:

这适用于持续集成和 WebDeploy:

这个问题在我设置的那一刻出现

<MvcBuildViews>true</MvcBuildViews>

在我的项目文件中,我需要这样做。

在阅读和测试我发现的关于这个问题的所有内容后,我有一个解决方法,它也适用于通过 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!!

更新: 将 debug 和 release 替换为 $(ConfigurationName) 并删除了生成的重复行

【讨论】:

  • 我希望我能完全理解为什么会发生这种情况。当我在本地机器上运行我的 TeamCity 服务器时,一切正常。一旦我们将 TeamCity 移动到专用的构建服务器,我们就开始遇到这个问题。也许值得开始一个 MS Connect 问题。
  • 我尝试了几种解决方案,包括 Pre/Post-build 事件命令行。这似乎只在第一次工作,但随后的构建不断失败。到目前为止,似乎只有 MvcBuildViews=false 提供了最一致的修复,但并不是每个项目都可以接受的解决方法。
【解决方案4】:

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

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

从主 Web.config 并将其留在 Web.debug.config 和 Web.release.config 中

【讨论】:

    【解决方案5】:

    Microsoft Team 提供了另一种解决方法。详情见here

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 你是救世主!.. 怎么没有人使用这个解决方案.. 非常感谢@JOB.. 这适用于 winforms、app.config - slowcheetah 转换!
      【解决方案7】:

      我发现这对我来说效果更好:

      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 消失。

      【讨论】:

      • @AndreCalil 不,不是我。
      • 没关系,所以。有些人只是不告诉我为什么就投了反对票。去图吧!
      【解决方案8】:

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

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

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

      将我的 web.config 修复为有效,现在一切正常。

      希望这对某人有所帮助

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          我只是在下面的 web.config 上更改

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

          <configuration>
          

          解决了问题

          【讨论】:

            【解决方案11】:
            1. 右击项目,点击发布
            2. 转到设置 -> 文件发布选项
            3. 取消选中发布期间预编译

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-07-04
              相关资源
              最近更新 更多