在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串
Posted
技术标签:
【中文标题】在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串【英文标题】:Setting the SQL connection string for ASP.NET Core web app in Azure 【发布时间】:2015-09-14 20:51:06 【问题描述】:我在 Visual Studio 2015 中创建了一个新的 ASP.NET Core Web 应用程序。我还设置了一个 Azure Web 应用程序以从 GitHub 中拉入该应用程序并运行它。这工作正常,但我无法连接到 Azure 上的数据库。
在本地,这是可行的,它使用config.json
和代码Data:DefaultConnection:ConnectionString
作为连接字符串。
我怎样才能让代码保持原样,并让它在 Azure 中也能工作?我尝试在门户中设置应用程序设置,包括连接字符串和应用程序设置。并使用“SQLCONNSTR_DefaultConnection”和“Data:DefaultConnection:ConnectionString”作为键。
(顺便设置一下App Settings好像不行,我觉得我提供的值太长了)。
那么,如何在不将其签入源代码控制的情况下,将 Azure 数据库的连接字符串提供给我的 Azure Web 应用程序 (ASP.NET 5)?
更新 我的 Startup.cs 看起来像这样(参见 the full file on GitHub):
public Startup(IHostingEnvironment env)
var configuration = new Configuration()
.AddJsonFile("config.json")
.AddJsonFile($"config.env.EnvironmentName.json", optional: true);
if (env.IsEnvironment("Development"))
configuration.AddUserSecrets();
configuration.AddEnvironmentVariables();
Configuration = configuration;
在ConfigureServices
方法中,还有:
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
并且,同样在ConfigureServices
方法中:
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
.AddDbContext<InvoicesDbContext>(options =>
options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
// So this is where I want my app in Azure to use the connection string I
// provide in the portal
【问题讨论】:
您能分享一下您的 Startup.cs 配置条目的外观吗? 如果您已正确设置所有内容,那么在您的 azure 网站中指定Data:DefaultConnection:ConnectionString
应该就可以了
您的示例代码未显示您如何访问 ConnectionString。您在哪里访问 ConnectionString?语法是什么。你也可以通过在VS中的项目属性->调试下设置环境变量来在本地测试环境变量。这有助于故障排除(即您设置 environment_variable 名称和设置名称相同)。
@GeraldDavis 我添加了关于如何访问连接字符串的代码。我将尝试有关项目属性的提示。
【参考方案1】:
简答
我尝试在门户中设置应用程序设置,包括连接字符串和应用程序设置。并使用“SQLCONNSTR_DefaultConnection”和“Data:DefaultConnection:ConnectionString”作为键。
你已经接近了。
-
转到 Azure Web 应用 > 配置 > 连接字符串。
添加名称为
DefaultConnection
的连接字符串。
使用Configuration.Get("Data:DefaultConnection:ConnectionString")
访问它。
使用timesheet_db
代替DefaultConnection
的示例
这是我自己的时间表应用程序中的一个示例。我的连接字符串被命名为timesheet_db
。只需将该字符串的所有实例替换为 DefaultConnection
即可使示例适应您的用例。
Azure Web 应用配置
Azure Web 应用服务控制管理器
https://myWebAppName.scm.azurewebsites.net/Env 的在线服务控制管理器将显示连接字符串。
Startup.cs
在Startup
中设置配置设置,以便环境变量覆盖 config.json。
public IConfiguration Configuration get; set;
public Startup()
Configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables(); <----- will cascade over config.json
在Startup
中配置数据库。
public void ConfigureServices(IServiceCollection services)
services
.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ProjectContext>(options =>
var connString =
Configuration.Get("Data:timesheet_db:ConnectionString");
options.UseSqlServer(connString);
);
当然,该示例使用名为timesheet_db
的连接字符串。对你来说,用你自己的名为DefaultConnection
的连接字符串替换它的所有实例,一切都会正常工作。
【讨论】:
这行得通。但是将“DefaultConnection”转换为“Data:DefaultConnection:ConnectionString”的魔法是什么? 魔法存在于 EnvironmentVariableConfigurationProvider 中,例如检查github.com/aspnet/Configuration/blob/dev/src/…。 顺便说一句,RC2 中的约定正在改变。配置密钥的格式为ConnectionStrings:name
。
Configuration.Get
具有该配置名称约定在最终版本中不再起作用。我们需要改用Configuration.GetConnectionString("timesheet_db")
。 ***.com/a/37511645/397807【参考方案2】:
在 RC2 中,我必须更改读取连接字符串的方式才能让它们在 Azure 中工作。在我的情况下,我必须确保 Azure 连接字符串被命名为“DefaultConnection”,并通过以下方式访问:
RC1:
"Data":
"DefaultConnection":
"ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=db;Trusted_Connection=True;"
访问者:
var conn = Configuration["Data:DefaultConnection:ConnectionString"];
RC2:
"Data":
,
"ConnectionStrings":
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=db;Trusted_Connection=True;"
访问者:
var conn = Configuration.GetConnectionString("DefaultConnection");
【讨论】:
【参考方案3】:您有许多选项来设置连接字符串。 默认设置类从不同来源获取环境设置。 您可以在 config.production.json 中设置连接字符串。或 config.staging.json。查看启动类
public Startup(IHostingEnvironment env)
// Setup configuration sources.
var configuration = new Configuration()
.AddJsonFile("config.json")
.AddJsonFile($"config.env.EnvironmentName.json", optional: true);
if (env.IsEnvironment("Development"))
// This reads the configuration keys from the secret store.
// For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
configuration.AddUserSecrets();
configuration.AddEnvironmentVariables();
Configuration = configuration;
【讨论】:
我知道,但我不想将 config.production.json 添加到我公开的 GitHub 存储库中。据我了解,您可以在 Azure 门户中指定设置和连接字符串(阅读 this)。但我无法让它工作。【参考方案4】:我想你在找SlotSticky Settings
在 Azure PowerShell 中使用此命令将 2 个应用设置设置为粘到插槽
Set-AzureWebsite -Name mysite -SlotStickyAppSettingNames @("myslot", "myslot2")
这个命令将 2 个连接字符串设置为粘在插槽上
Set-AzureWebsite -Name mysite -SlotStickyConnectionStringNames @("myconn", "myconn2")
【讨论】:
以上是关于在 Azure 中为 ASP.NET Core Web 应用设置 SQL 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章
在应用服务环境中安装 ASP.NET CORE 3.0 扩展?
Azure 部署后 ASP.NET Core MVC webapp 错误
在 Azure 上部署 Asp.NET Core Web App