发布是不是在改变web.config?

时间:2011-03-25 14:51:54

标签: asp.net deployment .net-4.0 web-config web-config-transform

我制作了web.config full file ,它没有显示XML错误)

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <configSections>
      ...
      <location path="." inheritInChildApplications="false">
        <connectionStrings>
          <add name="ElmahLog" connectionString="data source=~/App_Data/Error.db" />
          <add name="database" connectionString="w" providerName="System.Data.EntityClient"/>
        </connectionStrings>
      </location>
  ...

使用转换文件(web.Staging.config

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <connectionStrings>
    <add name="database"
      connectionString="c"
      providerName="System.Data.EntityClient"
      xdt:Transform="SetAttributes" xdt:Locator="Match(name)" />
  </connectionStrings>
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <customErrors defaultRedirect="error.aspx"
      mode="RemoteOnly" xdt:Transform="Replace">
    </customErrors>
  </system.web>
</configuration>

我以Staging模式发布(右键点击网站&gt;发布&gt;方法:文件系统...)

------ Build started: Project: Drawing, Configuration: Staging Any CPU ------
  Drawing -> D:\Project\bin\Staging\Drawing.dll
------ Build started: Project: MySystem, Configuration: Staging Any CPU ------
  MySystem -> D:\Project\bin\Staging\MySystem.dll
...

但是当我查看输出文件夹中的web.config时,它不会被更改。

我在构建日志中找到以下内容:

D:\Project\Web.Staging.config(3,2): Warning : No element in the source document matches '/configuration'
D:\Project\Web.Staging.config(3,2): Warning : No element in the source document matches '/configuration'
D:\Project\Web.Staging.config(3,2): Warning : No element in the source document matches '/configuration'
Transformed web.config using Web.Staging.config into obj\Staging\TransformWebConfig\transformed\web.config.

可能是什么问题?我这样做了吗?

7 个答案:

答案 0 :(得分:20)

回答迟到但也许我可以让别人头疼。在Visual Studio 2013中,有两个位置可供选择用于构建和部署的配置。配置管理器,然后再次使用“发布Web”,其中“向导”向导中的第三步允许您选择要使用的配置。如果您没有选择新配置,它将使用所选配置的变换而不是您的配置。

答案 1 :(得分:16)

我发现了两件事:

  • 您无法在<configuration>代码上设置名称空间(例如:for <location path="." inheritInChildApplications="false">
  • 您必须在转换文件中查看正确的层次结构。

<configuration>
  <location>
    <connectionStrings>

而不是

<configuration>
  <connectionStrings>

答案 2 :(得分:4)

确保在Web.Config文件Build Action的属性中设置为Content

如果构建操作设置为None,则即使将其复制到输出目录,也不会对其进行转换。

答案 3 :(得分:1)

如果要添加的部分尚未出现在输出中,请确保包括InsertIfMissing

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>

      <security xdt:Transform="InsertIfMissing">
        <requestFiltering allowDoubleEscaping="true" />
      </security>

    </system.webServer>
  </location>
</configuration>

答案 4 :(得分:0)

不要忘记从原始的“web.config”复制“配置”的所有其他属性,因为看起来VS2012不会自动执行,当然也不会有匹配...

答案 5 :(得分:0)

答案也很晚,但这可能有助于某人。

我意识到,如果您在同一个解决方案中有两个网站,那么当您尝试发布其中一个网站时,如果您只为这两个项目配置一个网站,则转换可能无效。

我的一个网站总是在改变,但另一个网站有时是,有时候不是。

例如,我有配置&#34; Auto&#34;在解决方案中,两个网站都有web.Auto.config。

我通过创建一个具有不同名称的新配置来解决这个问题 - &#34; AutoAdmin&#34; - 为第二个项目创建web.AutoAdmin.config文件,当我再次发布它时,最终发生了转换。

答案 6 :(得分:0)

我按照以下步骤解决了此问题。谢谢@michaelhawkins指出正确的方向。您需要确保将配置更改为在两个位置发布。

enter image description here

然后右键单击您的项目,然后选择“属性”。如果无法正常工作,请尝试在CPU体系结构中选择x86

enter image description here