Azure 连接字符串最佳做法

Posted

技术标签:

【中文标题】Azure 连接字符串最佳做法【英文标题】:Azure connection string best practices 【发布时间】:2011-05-10 14:40:26 【问题描述】:

我有一个刚刚迁移到 Azure 的应用程序。目前我使用 web.config 转换来管理更改连接字符串 dev/staging/prod 环境的数据库。在 Azure 中如何最好地管理这些多个连接字符串?

【问题讨论】:

没有答案包括 Azure Key Vault,这里绝对应该提到它,以保护您的凭据(或加密密钥)用于所述凭据。有趣的是,您可以直接使用 Key Vault 注册您的 Azure 应用程序,并且不需要为您的 keyVault 客户端使用任何凭据,同时确保唯一能够读取您的连接字符串(或相关加密密钥)的人是应用程序本身。 【参考方案1】:

如果开发人员能否看到生产凭据并不重要,您可以使用内置的 Visual Studio 10 配置转换。如果这是您要查找的内容,请按照以下步骤操作:

1.在文件资源管理器中导航到您的 Azure 项目文件夹 2. 复制 ServiceConfiguration.cscfg 3. 将副本重命名为 ServiceConfiguration.Base.cscfg 4. 对于每个构建配置(例如 Dev、Staging、Production),创建一个 ServiceConfiguration..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 文件的末尾添加以下内容,就在 &lt;/Project&gt; 上方:

<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 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>

【讨论】:

我收到“WAT020:只能激活一个服务定义”。使用上述构建时出错...有什么想法我做错了吗? 嘿 jmac,我创建了一个使用 TransformXml 的 VS 插件 (visualstudiogallery.msdn.microsoft.com/…),许多人要求 Azure 项目支持。这看起来对我来说是一个很好的起点。如果我实施它,你能确保我做对了吗?您可以通过电子邮件与我联系:sayedha [at] MICROSOFTdotCOM。【参考方案2】:

我们个人:

    完全放弃了 Web 配置转换。 从 cscfg 检索设置。 cscfg 的开发版本指向本地开发环境(存储在版本控制中)。 在部署到生产环境时,我们为生产环境 SQL Azure 和存储提供安全凭据。

有关扫描应用程序设置和云环境以获取配置值的设置管理类示例,您可以查看开源Lokad.CQRS for Windows Azure 项目(请参阅 CloudSettingsProvider)

【讨论】:

【参考方案3】:

您可以在 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。

【讨论】:

【参考方案4】:

我们有许多环境(开发结构内的本地开发、开发结构外的本地开发、测试、发布,有 2 个版本:发布/生产和发布/暂存以及 20 个项目,其中一些需要在配置设置中有所变化。我们通过创建一个小型“配置”项目解决了这个问题,其中包含与环境匹配的子文件夹。在每次编译期间,我们根据我们正在执行的构建将子文件夹中的文件复制到配置项目的根文件夹中。

所有其他项目都链接到 .config 文件的配置项目。我们还使用部分配置文件来避免在各种环境中一直重复相同的信息。

希望对你有帮助

【讨论】:

终于在paraleap.com/blog/post/…发表了一篇关于此的博客 如果您的所有解决方案都重用同一个配置项目,您如何处理特定于解决方案的配置属性? 如果您的所有解决方案共享相同的配置文件并且 SolutionA 需要一个额外的配置属性(即&lt;Setting name="NewSettingProperty" value="123" /&gt;,您如何将其提供给 SolutionA i> 也没有将其提供给其他所有解决方案? 如果我理解正确的话,您可以在 Config 项目中创建子文件夹以将不同的项目相互隔离【参考方案5】:

我对转换 ServiceConfiguration 有同样的要求。

我接受了 jmac 的回答(谢谢!),但在 Base 版本中的命名空间有问题:

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

经过一番探索,找到了 Andrew Patterson 的 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>

【讨论】:

以上是关于Azure 连接字符串最佳做法的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数 - 到本地数据库的连接字符串

部署后修改连接字符串

为 WebSocket 连接更新令牌的最佳做法是啥

Azure 函数 - 从 Azure 密钥保管库获取服务总线连接字符串

带有特殊字符的 Azure 连接字符串

处理中途断开连接的控制器的最佳做法是啥?