gpt4 book ai didi

sql - 使用唯一的 Sql Azure 连接字符串打包和发布 Azure 云服务

转载 作者:行者123 更新时间:2023-12-02 06:51:48 25 4
gpt4 key购买 nike

我有一个 .NET Web 解决方案,其中包含一个 Azure 云服务项目和一个 webrole。我将其部署到东海岸西海岸数据/计算中心以进行故障转移,并被要求使用 Powershell MSBuild 和 Jenkins 自动执行部署。

问题是我需要在打包并发布到每个部署之前更改 Web.config 中的 Sql Azure 数据库连接字符串。看起来很简单。

据我所知,webrole 属性“设置”选项卡允许您使用“字符串”或“连接字符串”类型向每个部署添加自定义配置属性,但“连接字符串”选项似乎仅适用于 Blob、表或队列存储。如果我使用“String”并给它一个 Sql Azure 连接字符串类型,它会将其写为键/值对,而 Entity Framework 和成员资格提供程序找不到它。

有没有办法添加指向 Sql Azure 的每个部署连接字符串设置?

谢谢

大卫

最佳答案

埃里克的解决方案是完全有效的,我找到了另一种方法来解决问题,所以我想我应该回来并将其放在这里,因为我很难找到答案。

诀窍是让 Entity Framework 和任何提供程序(例如 asp.net Membership/profile/session 等)直接从 Azure 服务配置而不是站点 web.config 文件中读取连接字符串。

对于提供程序,我能够创建继承 System.Web.Providers.DefaultMembershipProvider 类并重写 Initialize() 方法,然后使用我编写的帮助程序类通过 RoleEnvironment.GetConfigurationSettingValue(设置名称);调用,它从 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。

对于未指定提供程序的 Entity Framework ,我必须使用帮助程序类中的 GetRoleEnvironmentSetting() 方法再次将此调用添加到 Global.asax:

var connString = AzureProvidersHelper.GetRoleEnvironmentSetting("ClientspaceDbContext");

Database.DefaultConnectionFactory = new SqlConnectionFactory(connString);

此解决方案的好处是您最终不必处理 Azure 角色 onstart 事件。

享受

dnash

关于sql - 使用唯一的 Sql Azure 连接字符串打包和发布 Azure 云服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16039944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com