Рекомендации по использованию строки подключения Azure

У меня есть приложение, которое я только что перехожу в Azure. В настоящее время я использую преобразование web.config для управления изменением среды подключения к базе данных dev / staging / prod. Как лучше всего управлять этими несколькими строками подключения в Azure?


person Craig    schedule 16.11.2010    source источник
comment
Ни один ответ не включает хранилище ключей Azure, которое обязательно следует упомянуть здесь, чтобы защитить ваши учетные данные (или ключ шифрования) для указанных учетных данных. Что интересно, вы можете зарегистрировать свое приложение Azure в Key Vault напрямую и вам не нужно использовать какие-либо учетные данные для вашего клиента keyVault, будучи уверенным, что единственный, кто сможет читать ваши строки подключения (или соответствующие ключи шифрования), - это само приложение.   -  person Thierry Prost    schedule 13.05.2019


Ответы (5)


В случаях, когда не имеет значения, видит ли разработчик производственные учетные данные, вы можете использовать встроенные преобразования конфигурации Visual Studio 10. Если это то, что вы ищете, выполните следующие действия:

1. Перейдите в папку проекта Azure в проводнике файлов
2. Сделайте копию ServiceConfiguration.cscfg
3. Переименуйте копию в ServiceConfiguration.Base.cscfg
4. Для каждой конфигурации сборки (например, Dev, Staging , Production), создайте файл конфигурации ServiceConfiguration. ‹Имя конфигурации› .cscfg. В этих файлах вы можете использовать обычный синтаксис преобразования конфигурации
5. Откройте файл .ccproj в текстовом редакторе
6. Найдите следующий узел,

<ItemGroup>
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
</ItemGroup>

и замените его на это (вам нужно будет отредактировать этот блок, чтобы он соответствовал вашим конфигурациям сборки):

<ItemGroup>
    <ServiceDefinition Include="ServiceDefinition.csdef" />
    <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
    <None Include="ServiceConfiguration.Base.cscfg">
        <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
    </None>
    <None Include="ServiceConfiguration.Dev.cscfg">
        <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
    </None>
    <None Include="ServiceConfiguration.Staging.cscfg">
        <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
    </None>
    <None Include="ServiceConfiguration.Production.cscfg">
        <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
    </None>
</ItemGroup>

7. Добавьте следующее в конец файла .ccproj, чуть выше </Project>:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
<Target Name="BeforeBuild">
    <TransformXml Source="ServiceConfiguration.Base.cscfg" Transform="ServiceConfiguration.$(Configuration).cscfg" Destination="ServiceConfiguration.cscfg" />
</Target>

8. Если вы используете CI-сервер, на котором не установлена ​​Visual Studio 10, вам, вероятно, придется скопировать папку C: \ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web и ее содержимое из машина разработки к серверу.

Обновление: как отметил , @SolarSteve, вам может потребоваться добавить пространство имен в файлы ServiceConfiguration. *. cscfg. Вот пример ServiceConfiguration.Base.cscfg:

<sc:ServiceConfiguration serviceName="MyServiceName" osFamily="1" osVersion="*" xmlns:sc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <sc:Role name="MyRoleName">
    <sc:Instances count="1" />
    <sc:ConfigurationSettings>
      <sc:Setting name="DataConnectionString" value="xxx" />
    </sc:ConfigurationSettings>
  </sc:Role>
</sc:ServiceConfiguration>
person Jonathan McIntire    schedule 03.03.2011
comment
Я получаю WAT020: может быть активным только одно определение службы. ошибка при построении с использованием вышеуказанного ... какие-либо идеи, что я сделал не так? - person Jack Hughes; 31.05.2011
comment
Привет, jmac, я создал надстройку VS (visualstudiogallery.msdn.microsoft .com /), который использует TransformXml, кучка людей попросила поддержки проекта Azure. Похоже, это будет для меня хорошей отправной точкой. Если я его использую, сможете ли вы убедиться, что я правильно понял? Вы можете связаться со мной по электронной почте: sayedha [at] {MICROSOFTdotCOM}. - person Sayed Ibrahim Hashimi; 31.12.2011

Лично мы:

  1. Полностью исключены преобразования веб-конфигурации.
  2. Настройка берется из cscfg.
  3. Версия для разработки cscfg указывает на локальную среду разработки (которая хранится в системе контроля версий).
  4. При развертывании в производственной среде мы предоставляем безопасные учетные данные для производственной среды SQL Azure и хранилища.

Образец класса управления настройками, который сканирует настройки приложения и облачную среду на предмет значений конфигурации, можно найти в Lokad.CQRS с открытым исходным кодом. для проекта Windows Azure (см. CloudSettingsProvider)

person Rinat Abdullin    schedule 16.11.2010

CloudConfigurationManager можно использовать в пакете SDK Azure 1.7 http://msdn.microsoft.com/en-us/LIBRARY/microsoft.windowsazure.cloudconfigurationmanager

Это начинается с просмотра файла ServiceConfiguration.cscfg, например. ServiceConfiguration.Cloud.cscfg для настройки конфигурации. Если его там нет, он возвращается к web.config и app.config

Например

CloudConfigurationManager.GetSetting("StorageConnectionString")

Будет искать в соответствующем файле cscfgfile параметр StorageConnectionString, затем поиск выполняется в web.config, а затем в app.config.

person GraemeMiller    schedule 26.06.2012

У нас есть несколько сред (локальный разработчик внутри структуры разработки, локальный разработчик вне структуры разработки, тестирование, выпуск, который имеет 2 версии: выпуск / прод и выпуск / постановка и 20 проектов, некоторые из которых нуждаются в некоторой изменчивости в настройках конфигурации. Мы решили эту проблему Проблема заключается в создании крошечного проекта "config", включающего туда подпапки, соответствующие средам.Мы копируем файлы из подпапки в зависимости от того, какую сборку мы делаем, в корневую папку проекта конфигурации во время каждой компиляции.

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

Надеюсь это поможет

person Igorek    schedule 16.11.2010
comment
Наконец, опубликовал блог об этом по адресу paraleap.com/blog/post/ - person Igorek; 13.09.2011
comment
Если все ваши решения повторно используют один и тот же проект конфигурации, как вы обрабатываете свойства конфигурации, специфичные для решения? - person Jeff; 25.09.2012
comment
Если все ваши решения используют одни и те же файлы конфигурации и для SolutionA требуется дополнительное свойство конфигурации (например, <Setting name="NewSettingProperty" value="123" />, как вы дадите это SolutionA, не передавая его другим решениям ? - person Jeff; 25.09.2012
comment
Вы можете создать подпапки в проекте Config, чтобы отделить разные проекты друг от друга, если я правильно вас понял. - person Igorek; 26.09.2012

У меня было такое же требование к преобразованию ServiceConfiguration.

Я получил ответ от jmac (спасибо!), Но у меня возникли проблемы с пространством имен в базовой версии:

<ServiceConfiguration serviceName="TestCloud2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">

после того, как еще немного покопался, нашел это Эндрю Паттерсон (Спасибо).

так что мой результирующий файл преобразования:

<asc:ServiceConfiguration serviceName="TestCloud2" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xmlns:asc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
<asc:Role name="WebRole1">
    <asc:Instances count="1" />
    <asc:ConfigurationSettings>
        <asc:Setting name="LoggingStorage" value="UseDevelopmentStorage=true" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </asc:ConfigurationSettings>
</asc:Role>

person SolarSteve    schedule 31.05.2011