Azure中的Web.Config连接字符串和ServiceConfiguration连接字符串之间的关系是什么?

时间:2011-10-27 12:02:14

标签: azure web-config configuration-files

我对Windows Azure比较陌生,我需要更好地了解Azure平台如何处理连接字符串配置设置。

假设我有一个ASP.Net Web项目,它有一个Web.Config连接字符串设置,如下所示:

    <add name="MyDb" connectionString="Data Source=NzSqlServer01;Initial Catalog=MyAzureDb;User ID=joe;Password=bloggs;"
  providerName="System.Data.SqlClient" />

我使用此连接字符串进行本地测试等。假设我有一个 ServiceConfiguration.Local.cscfg 文件,该文件包含相同的连接信息。

现在我已准备好部署到我的Azure实例。我的ServiceConfiguration.Cloud.cscfg文件如下所示:

  <Setting name="MyDb" 
    value="Data Source=tcp:e54wn1clij.database.windows.net;Database=MyAzureDb{0};User ID=joe.bloggs@e54wn1clij;Password=reallysecure;Trusted_Connection=False;Encrypt=True;" />

我正在努力解决的问题是,如果我的Web应用程序中有代码正在查找名为“MyDb”的连接字符串(例如,通过调用以下代码行:ConfigurationManager.ConnectionStrings["CeraDb"].ConnectionString) ,Azure是否自动知道根据ServiceConfiguration文件的连接字符串查找名为MyAzureDb1或MyAzureDb2的数据库,或者Web应用程序的代码只是查找Web.Config中的任何内容并且无法正确地对数据库连接进行负载平衡?

2 个答案:

答案 0 :(得分:4)

您需要调用RoleEnvironment.GetConfigurationSettingValue(...)来读取ServiceConfiguration.Cloud.cscfg中的那个。

使用.cscfg存储设置的优点是您可以在运行时更改它们,而无需部署新代码。 Web.config只是你应用程序的另一个文件,所以你必须部署一个新包来更新它,但是.cscfg中的设置可以在门户中修改或上传一个新的.cscfg文件而不需要部署和干扰app本身。

答案 1 :(得分:1)

本质上,除非您另有代码,否则所有Azure实例都是相同的。在您的情况下,这意味着同一Web角色的两个或多个实例的配置将是相同的。

因此,如果您对数据库进行了分片并希望不同的实例读取不同的数据库,那么您需要在启动代码中变得聪明并创建一些将分片分配给实例的东西。您可以访问System.Environment.MachineName,它可以在实例启动后区分代码。

有几种方法可以做到这一点。一个可能是在(例如)表存储中有一个中央注册表,它记录了一个分片实例的最后一次看到的时间。服务器上的后台进程会定期写入此日志。然后,在实例启动时,检查每个分片的最后查看时间 - 如果有任何“陈旧”(显着早于当前时间减去写入间隔),则实例知道它可以声明该分片为自己的旧分区实例已经死了。

(但是,有更好的分片方法,通常围绕系统使用的数据 - 例如系统中最大的表格。)