我有一个应用程序,我只是迁移到Azure。目前我使用web.config转换来管理更改数据库连接字符串dev / staging / prod环境。如何在Azure中管理这些多个连接字符串?
答案 0 :(得分:28)
如果开发人员可以看到生产凭据并不重要,则可以使用内置的Visual Studio 10配置转换。如果这是您正在寻找的,请按照下列步骤操作:
1.导航到文件资源管理器中的Azure项目文件夹
2.制作ServiceConfiguration.cscfg的副本
3.将副本重命名为ServiceConfiguration.Base.cscfg
4.对于每个构建配置(例如Dev,Staging,Production),创建ServiceConfiguration。< build config name> .cscfg文件。在这些文件中,您可以使用普通config transformation syntax
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服务器,则可能需要复制C:\ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web文件夹,它的内容从开发机器到服务器。
更新:作为@SolarSteve noted,您可能必须在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>
答案 1 :(得分:14)
我个人:
对于扫描应用程序设置和云环境以获取配置值的设置管理类示例,您可以查看开源Lokad.CQRS for Windows Azure项目(请参阅CloudSettingsProvider)
答案 2 :(得分:7)
您可以在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。
答案 3 :(得分:6)
我们有许多环境(开发结构中的本地开发,开发结构外部的本地开发,测试,发布有2个版本:发布/产品和发布/暂存以及20个项目,其中一些需要在配置设置中有一些变化。我们通过创建一个微小的“配置”项目来解决这个问题,其中包含与环境匹配的子文件夹。我们在每次编译期间将文件从子文件夹中复制,具体取决于我们在配置项目的根文件夹中所做的构建。
所有其他项目链接到.config文件的配置项目。我们还使用部分配置文件来保持在各种环境中始终重复相同信息的精神错误。
希望这有帮助
答案 4 :(得分:6)
我对转换ServiceConfiguration有同样的要求。
我接受了jmac的回答(谢谢!),但在Base版本中遇到了命名空间问题:
<ServiceConfiguration serviceName="TestCloud2" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
经过安德鲁·帕特森(谢谢)发现this之后再次探讨了一下。
所以我得到的转换文件:
<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>