Как преобразовать configSource во встроенные элементы в web.config при преобразовании

В настоящее время мой web.config выглядит примерно так:

<configuration>
  <connectionStrings configSource="connectionstrings.config"/>
</configuration>

При создании пакета развертывания (Msbuild.exe + target=Package) он не "волшебным образом" параметризует мои строки подключения в файл parameters.xml для замены при развертывании.

Когда я встраиваю мои строки подключения, все в порядке, и параметры генерируются для моих строк подключения..

Так:

Как я могу скопировать содержимое connectionstrings.config в качестве замены моего <... configsource = "xxx" /> при развертывании через преобразование web.config?

РЕДАКТИРОВАТЬ: я принял ответ Саида Ибрагима, потому что поведение "по умолчанию" действительно хорошо (автоматическая параметризация строк соединений в web.config), но в конце лучше точно указать, какие вещи должны быть параметризованы (либо через {имя_проекта} файл.wpp.targets или parameters.xml).

1 ответ

Решение

Вы задаете не тот вопрос, не беспокойтесь о том, как преобразовать его обратно в web.config. Вместо этого просто создайте параметры для строк подключения в файле, где они должны быть. Я только что написал это на http://sedodream.com/2012/05/13/VSWebPublishHowToParameterizeConnectionStringsOutsideOfWebconfig.aspx. Я также вставил содержание ниже для вас.

Если вы использовали веб-публикацию Visual Studio в VS 2010 или VS 11 для создания пакетов Web Deploy, то вы, вероятно, знаете, что мы автоматически параметрируем строки подключения в web.config. Если вы не знакомы с параметрами Web Deploy, это способ заявить, что вы хотите легко иметь возможность обновлять значение чего-либо при последующей публикации пакета. Строки подключения являются хорошими примерами чего-то, что обычно необходимо обновить во время публикации.

Как я уже говорил ранее, если вы создадите пакет Web Deploy в Visual Studio, мы автоматически создадим параметры Web Deploy для всех ваших строк подключения в web.config. Ранее сегодня я видел вопрос о Stackru, спрашивающий, как параметризовать строки подключения в файлах, не относящихся к web.config (вопрос на самом деле задавал что-то еще, но я думаю, что он действительно этого хочет). Я создал образец, показывающий, как это сделать. Ниже показано, как выглядит элемент connectionStrings в файле web.config.

<connectionStrings configSource="connectionStrings.config" />

А вот соединение Strings.config

<connectionStrings>
  <clear/>
  <add name="ApplicationServices"
       connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
       providerName="System.Data.SqlClient" />
  <add name="OtherConnectionString"
       connectionString="data source=.\SQLExpress;Integrated Security=SSPI;Initial Catalog=foo"
       providerName="System.Data.SqlClient"/>
</connectionStrings>

Для параметризации этих строк подключения вам нужно будет расширить конвейер веб-публикации. Для этого создайте файл с именем {project-name}.wpp.targets в корневом каталоге проекта, в котором вы работаете (для проектов VS 11 вы можете поместить все это прямо в файлы.pubxml). Это будет файл MSBuild, который будет импортирован в процесс сборки / публикации. Ниже приведен файл, который необходимо создать.

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <!-- Here we need to declare MSDeploy parameters for connection strings in connectionStrings.config -->
    <MsDeployDeclareParameters Include="ApplicationServices-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='ApplicationServices']/@connectionString</Match>
      <Description>Connection string for ApplicationServices</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=AppServices</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>

    <MsDeployDeclareParameters Include="OtherConnectionString-ConnectionString" >
      <Kind>XmlFile</Kind>
      <Scope>connectionStrings.config$</Scope>
      <Match>/connectionStrings/add[@name='OtherConnectionString']/@connectionString</Match>
      <Description>Connection string for OtherConnectionString</Description>
      <DefaultValue>data source=(localhost);Initial Catalog=OtherDb</DefaultValue>
      <Tags>SqlConnectionString</Tags>
    </MsDeployDeclareParameters>
  </ItemGroup>

</Project>

Здесь вы можете видеть, что я создаю значения для MSDeployDeclareParameters. При упаковке / публикации этот список элементов используется для создания параметров MSDeploy. Ниже приведено объяснение значений метаданных, каждое из которых содержит.

  • Вид = для этого случая это всегда будет Xmlfile, узнать больше
  • Scope = регулярное выражение для файла, который необходимо изменить
  • Match = выражение XPath с атрибутом / элементом, который будет обновлен
  • Описание = необязательное описание (оно будет отображаться в диспетчере IIS при импорте pkg)
  • DefaultValue = необязательное значение по умолчанию для параметра Теги = необязательно, для строк подключения используйте SqlConnectionString

После создания этого файла вам нужно будет закрыть / заново открыть VS (он кэширует импортированные файлы.targets). Затем вы можете создать веб-пакет развертывания. Когда вы сделаете это, эти новые параметры будут объявлены. В моем случае я импортировал это в диспетчер IIS, и вот диалоговое окно с параметрами.

Как вы можете видеть, здесь указан параметр "Путь к приложению", а также мои собственные значения строки подключения. Когда я обновляю значения в текстовом поле и открываю connectionStrings.config на моем веб-сервере, они были значениями, которые я ввел в диалоговом окне.

К вашему сведению, я загрузил этот пример в свою учетную запись на github в ParameterizeConStringConfig.

Другие вопросы по тегам