Azure连接string最佳实践
我有一个应用程序,我只是迁移到Azure。 目前我使用web.config转换来pipe理更改数据库连接stringdev / staging / prod环境。 在Azure中pipe理这些多个连接string最好如何?
如果开发人员可以查看生产凭证并不重要,则可以使用内置的Visual Studio 10configuration转换。 如果这是您正在寻找的,请按照下列步骤操作:
1.导航到文件资源pipe理器中的Azure项目文件夹
2.制作一份ServiceConfiguration.cscfg的副本
3.将副本重命名为ServiceConfiguration.Base.cscfg
4.对于每个构buildconfiguration(例如Dev,Staging,Production),创build一个ServiceConfiguration。<build config name> .cscfg文件。 在这些文件中,您可以使用正常的configuration转换语法
5.在文本编辑器中打开.ccproj文件
6.find下面的节点,
<ItemGroup> <ServiceDefinition Include="ServiceDefinition.csdef" /> <ServiceConfiguration Include="ServiceConfiguration.cscfg" /> </ItemGroup>
并用这个replace它(你将不得不编辑这个块来匹配你的构buildconfiguration):
<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>
在.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 指出的那样 ,您可能需要为您的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>
我们个人:
- 彻底删除了Webconfiguration转换。
- 设置从cscfg中检索。
- 开发版本的cscfg指向本地开发环境(存储在版本控制中)。
- 在部署到生产时,我们为生产SQL Azure和存储提供安全证书。
有关扫描应用程序设置和云环境以获取configuration值的设置pipe理类的示例,可以查看Windows Azure项目的开源Lokad.CQRS (请参阅CloudSettingsProvider)
您可以在Azure SDK 1.7中使用CloudConfigurationManager http://msdn.microsoft.com/en-us/LIBRARY/microsoft.windowsazure.cloudconfigurationmanager
这首先查看ServiceConfiguration.cscfg,例如ServiceConfiguration.Cloud.cscfg中的configuration设置。 如果它不在那里,则回落到web.config和app.config
例如
CloudConfigurationManager.GetSetting("StorageConnectionString")
将查找适当的cscfgfile为StorageConnectionString设置,然后它将searchweb.config,然后app.config。
我们有许多环境(本地开发内部开发结构,本地开发外部开发结构,testing,发布有2个版本:release / prod和release / staging和20个项目,其中一些需要configuration设置的变化,我们解决了这个问题通过创build一个小的“configuration”项目,包括子文件夹,其中包括与环境相匹配的子文件夹,在每次编译期间,根据我们正在做什么构build到子项目的根文件夹中,从子文件夹复制文件。
所有其他项目链接到.config文件的configuration项目。 我们也使用部分configuration文件来保持在各种环境中始终重复相同的信息的疯狂。
希望这可以帮助
我有相同的要求转换ServiceConfiguration。
我用jmac的回答(谢谢!),但在基本版本的命名空间有问题:
<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>