Опубликовать не преобразование web.config?

Я сделал web.config ( полный файл, он не показывает ошибки 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 (щелкните правой кнопкой мыши веб-сайт > Опубликовать > Метод: Файловая система...)

------ 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.

В чем может быть проблема? Правильно ли я делаю это?

Ответ 1

Я узнал две вещи:

  • Вы не можете установить пространство имен в теге <configuration> (например: для <location path="." inheritInChildApplications="false">)
  • Вы должны следить за правильной иерархией в файле преобразования.

Как

<configuration>
  <location>
    <connectionStrings>

Вместо

<configuration>
  <connectionStrings>

Ответ 2

Отвечая поздно, но, возможно, я могу спасти кого-то от головной боли. В Visual Studio 2013 есть два места для выбора конфигурации для вашей сборки и развертывания. Диспетчер конфигурации, а затем снова с Publish Web, где третий шаг в Мастере под названием "Настройки" позволяет вам выбрать Config, который вы хотите использовать. Если вы не выбрали новую конфигурацию, она будет использовать преобразование для выбранной конфигурации вместо вашей.

Ответ 3

Убедитесь, что в свойствах файла Web.Config Build Action установлено значение Content.

Если для действия сборки установлено значение None, оно не будет преобразовано, даже если оно будет скопировано в выходной каталог.

Ответ 4

Не забудьте скопировать все остальные атрибуты "конфигурации" из оригинального "web.config", так как кажется, что VS2012 не делает это автоматически и, конечно, совпадения не будет...

Ответ 5

Отвечая позже, но это может помочь кому-то.

Я понял, что если у вас есть два веб-сайта в одном решении, когда вы пытаетесь опубликовать одно из них, преобразование может не работать, если у вас есть только одна конфигурация для обоих проектов.

Один из моих сайтов всегда трансформировался, а другой иногда был, а иногда и не был.

Например, у меня была конфигурация "Авто" в решении и была web.Auto.config для обоих веб-сайтов.

Я решил, что, создав новую конфигурацию с другим именем - "AutoAdmin" - создав также свой файл web.AutoAdmin.config для второго проекта, а когда я снова опубликовал его, окончательно произошла трансформация.