我有一个刚刚迁移到 Azure 的应用程序。目前我使用 web.config 转换来管理更改连接字符串 dev/staging/prod 环境的数据库。在 Azure 中如何最好地管理这些多个连接字符串?
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.如果您使用的是未安装 Visual Studio 10 的 CI 服务器,您可能需要从服务器的开发机器。
更新:正如@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>
我们个人:
- 完全放弃了 Web 配置转换。
- 从 cscfg 检索设置。
- cscfg 的开发版本指向本地开发环境(存储在版本控制中)。
- 在部署到生产环境时,我们为生产环境 SQL Azure 和存储提供安全凭据。
有关扫描应用程序设置和云环境以获取配置值的设置管理类示例,您可以查看适用于 Windows Azure项目的开源Lokad.CQRS (请参阅 CloudSettingsProvider)
您可以在 Azure SDK 1.7 http://msdn.microsoft.com/en-us/LIBRARY/microsoft.windowsazure.cloudconfigurationmanager中使用 CloudConfigurationManager
首先查看 ServiceConfiguration.cscfg,例如 ServiceConfiguration.Cloud.cscfg 进行配置设置。如果它不存在,它会退回到 web.config 和 app.config
例如
CloudConfigurationManager.GetSetting("StorageConnectionString")
将在适当的 cscfgfile 中查找 StorageConnectionString 设置,然后搜索 web.config 和 app.config。
我对转换 ServiceConfiguration 有相同的要求。
我接受了 jmac 的回答(谢谢!),但在 Base 版本中的命名空间有问题:
<ServiceConfiguration serviceName="TestCloud2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
经过更多的探索,安德鲁·帕特森(Andrew Patterson)发现了这个(谢谢)。
所以我生成的转换文件:
<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>
我们有许多环境(本地开发内部开发结构,本地开发外部开发结构,测试,发布有 2 个版本:发布/生产和发布/暂存和 20 个项目,其中一些需要在配置设置中有所变化。我们解决了这个问题通过创建一个小的“配置”项目来解决问题,其中包含与环境匹配的子文件夹。在每次编译期间,我们根据我们正在执行的构建将文件从子文件夹复制到配置项目的根文件夹中。
所有其他项目都链接到 .config 文件的配置项目。我们还使用部分配置文件来保持在各种环境中一直重复相同信息的疯狂。
希望这可以帮助