Почему некоторые Web.config преобразуются в токены в SetParameters.xml, а другие нет?

Я использовал конфигурационные преобразования в VS2010 в последнее время, но в замешательстве, почему некоторые преобразования применяются непосредственно к Web.config в пакете, но другие хранятся против токена в SetParameters.xml, а затем применяются в публикации.

Например, возьмите файл Web.config со следующей строкой подключения и настройкой приложения:

<connectionStrings>
  <add name="AutoDeployDb" connectionString="Data Source=(local);Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=Passw0rd"/>
</connectionStrings>
<appSettings>
  <add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
</appSettings>

Затем здесь соответствующее конфигурационное преобразование для текущей конфигурации сборки:

<connectionStrings>
  <add xdt:Transform="Replace" xdt:Locator="Match(name)" name="AutoDeployDb" connectionString="Data Source=MyDevServer;Initial Catalog=AutoDeploy;User ID=AutoDeployUser;Password=s*#@Kdsl" />
</connectionStrings>
<appSettings>
  <add xdt:Transform="Replace" xdt:Locator="Match(key)" key="ChartImageHandler" value="storage=file;timeout=20;dir=d:\inetpub\AutoDeploy\TempImageFiles\"/>
</appSettings>

Это оба преобразования "Заменить", а другое - это строка соединения, соответствующая "имя", а другая - параметры приложения, соответствующие "клавише", на мой взгляд, они идентичны.

Теперь загляните в файл SetParameters.xml в результирующем пакете, и только строка соединения имеет setParameter node. В папке Web.config папки PackagTmp преобразование параметров приложения уже применяется, когда строка подключения имеет значение $(ReplacableToken_AutoDeployDb-Web.config Connection String_0), которое применяется только при развертывании пакета.

Почему это? Это что-то конкретное для строк подключения (или, наоборот, к настройкам приложения)? Я ценю обоснование этого подхода, я просто не понимаю, почему он применим к некоторым настройкам, а не к другим.

Может ли кто-нибудь пролить свет на это?

Ответ 1

Это фактически не имеет ничего общего с конфигурационными преобразованиями. Я просто разместил очень подробный блог в http://sedodream.com/2010/11/11/ASPNETWebApplicationPublishPackageTokenizingParameters.aspx. Но какая-то информация здесь для вас.

В Трубе веб-публикации (WPP) мы обрабатываем строки подключения как специальные артефакты. Мы будем автоматически создавать параметры для всех строк подключения. Это связано с тем, что во многих случаях при развертывании приложения вы хотите изменить строки подключения. Мы не создаем автоматически параметры для любого значения appSettting. Теперь вернемся к вашему вопросу, почему мы токенизируем строки подключения? Мы действительно делаем это, чтобы убедиться, что вы не пропустите настройку значения, а затем случайно попросите приложение обновить неправильную БД. Мы вам помогаем, создавая эти параметры для вас. Также вы можете отключить это поведение, если хотите. Вы можете установить для свойства MSBuild AutoParameterizationWebConfigConnectionStrings значение false.

Ответ 2

Относительно развертывания существует одна существенная разница между ними. При импорте веб-пакетов в IIS:

  • Строки подключения будут автоматически включены в диалог мастера для дальнейшей параметризации.
  • Настройки приложения по умолчанию не будут. Если вы действительно этого хотите, выполните следующие шаги в разделе "Пользовательские параметры параметризации - Параметры приложения в файле web.config" в Настройка параметров для развертывания веб-пакетов

Дифференциация создает границу ответственности между dev и ops. С одной стороны, вы устанавливаете параметры целевой среды (базы данных, кеша, ключа/секретности AWS и т.д.) В строках соединений, о которых необходимо позаботиться. С другой стороны, вы устанавливаете нерелевантные параметры в разделе настроек приложений, так что операционная нагрузка на определенные продукты и бизнес-логику может быть уменьшена.

В моей компании один из оппонентов часто несет ответственность за несколько продуктов. Вы действительно не можете требовать от них знать столько знаний о продукте, сколько вы. Чем меньше им нужно обратить внимание, тем счастливее будет жизнь.