使用独特的Sql Azure connectionStrings打包并发布Azure Cloud Service
我有一个带有Azure云服务项目和单个webrole的.NET Web解决方案。 我将它部署到东海岸西海岸的数据/计算中心以实现故障切换,并被要求使用Powershell MSBuild和Jenkins自动部署。
问题是我需要在打包和发布到每个部署之前更改Web.config中的Sql Azure数据库连接字符串。 看起来很简单。
我知道webrole属性设置选项卡允许您为每个部署添加自定义配置属性,类型为“字符串”或“连接字符串”,但它看起来像“连接字符串”选项仅适用于Blob,表或队列存储。 如果我使用“字符串”并给它一个Sql Azure连接字符串类型,它会将它写为键/值对,实体框架和成员资格提供程序找不到它。
有没有办法添加指向Sql Azure的每个部署连接字符串设置?
谢谢,
大卫
埃里克的解决方案是完全有效的,我找到了解决问题的另一种方法,所以我想我会回来放在这里,因为我找到答案时遇到了这样的困难。
诀窍是让Entity Framework和任何提供程序(如asp.net Membership / profile / session等)直接从Azure服务配置而不是网站web.config文件读取连接字符串。
对于提供者,我可以创建继承System.Web.Providers.DefaultMembershipProvider类的类并重写Initialize()方法,然后使用我编写的帮助器类使用RoleEnvironment.GetConfigurationSettingValue(settingName)检索连接字符串; 调用,它从Azure服务配置读取。
然后我告诉成员资格提供者使用我的类而不是DefaultMembershipProvider。 代码如下:
Web.config文件:
<membership defaultProvider="AzureMembershipProvider">
<providers>
<add name="AzureMembershipProvider" type="clientspace.ServiceConfig.AzureMembershipProvider" connectionStringName="ClientspaceDbContext" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
请注意自定义提供程序“AzuremembershipProvider”
AzuremembershipProvider类:
public class AzureMembershipProvider : System.Web.Providers.DefaultMembershipProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
string connectionStringName = config["connectionStringName"];
AzureProvidersHelper.UpdateConnectionString(connectionStringName, AzureProvidersHelper.GetRoleEnvironmentSetting(connectionStringName),
AzureProvidersHelper.GetRoleEnvironmentSetting(connectionStringName + "ProviderName"));
base.Initialize(name, config);
}
}
这里是助手类AzureProvidersHelper.cs:
public static class AzureProvidersHelper
{
internal static string GetRoleEnvironmentSetting(string settingName)
{
try
{
return RoleEnvironment.GetConfigurationSettingValue(settingName);
}
catch
{
throw new ConfigurationErrorsException(String.Format("Unable to find setting in ServiceConfiguration.cscfg: {0}", settingName));
}
}
private static void SetConnectionStringsReadOnly(bool isReadOnly)
{
var fieldInfo = typeof (ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
if (
fieldInfo != null)
fieldInfo.SetValue(ConfigurationManager.ConnectionStrings, isReadOnly);
}
private static readonly object ConnectionStringLock = new object();
internal static void UpdateConnectionString(string name, string connectionString, string providerName)
{
SetConnectionStringsReadOnly(false);
lock (ConnectionStringLock)
{
ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings["name"];
if (connectionStringSettings != null)
{
connectionStringSettings.ConnectionString = connectionString;
connectionStringSettings.ProviderName = providerName;
}
else
{
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(name, connectionString, providerName));
}
}
SetConnectionStringsReadOnly(true);
}
}
这里的关键是RoleEnvironment.GetConfigurationSettingValue从Azure服务配置读取而不是web.config。
对于不指定提供者的实体框架,我必须再次使用助手类中的GetRoleEnvironmentSetting()方法将此调用添加到Global.asax中:
var connString = AzureProvidersHelper.GetRoleEnvironmentSetting("ClientspaceDbContext");
Database.DefaultConnectionFactory = new SqlConnectionFactory(connString);
这个解决方案的好处在于,您最终不必处理Azure角色onstart事件。
请享用
德纳什
大卫,
一个好的选择是使用Azure配置。 如果您右键单击Azure项目,则可以添加其他配置。 将连接字符串置于正确的配置中(例如,ServiceConfiguration.WestCoast.cscfg,ServiceConfiguration.EastCoast.cscfg等)。
在您的构建脚本中,将TargetProfile属性传递给具有配置名称的MSBuild,并将这些设置内置到最终的cscfg中。
如果遇到任何问题,请告诉我。 我做了这个方法,并且花了一些努力才使它正常工作。 一些细节可能会有所帮助。
埃里克
链接地址: http://www.djcxy.com/p/68491.html上一篇: Package and publish Azure Cloud Service with unique Sql Azure connectionStrings