在 Azure 上访问 ASP.NET 5 中的连接字符串
Access connection strings in ASP.NET 5 on Azure
在ASP.NET5中,我们如何以编程方式访问Azure Web App的连接字符串?我已经能够检索 TEST_APP_SETTINGS
值,但不能检索 TestConnString
值。
这是我尝试过的:
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
恐怕 AppSettings
不存在。我也这样做了,应用程序设置出现了,但连接字符串没有。
Startup.cs
// Setup configuration sources.
Configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
// Allow access from *.cshtml
services.AddSingleton<Configuration>(provider =>
{
return Configuration as Configuration;
});
Dev.cshtml
@inject Microsoft.Framework.ConfigurationModel.Configuration config;
<dl>
@foreach(var k in @config.GetSubKeys())
{
<dt>@k.Key</dt>
<dd>@config.Get(k.Key)</dd>
}
</dl>
连接字符串设置为环境变量。因此,首先您必须 add the environment variable configuration source,然后连接字符串将被命名为 Data:NAME:ConnectionString
,其中 NAME
是门户中连接字符串的名称。
例如,如果您的连接字符串是 "ServerConnection",那么您可以使用 Data:ServerConnection:ConnectionString
访问它
Here 是验证映射环境配置映射的测试,他们可能会更好地解释它。
这是 Victor 回答的扩展,它帮助我了解了新 MVC 6 环境中发生的事情。
在 config.json 文件中我有这个:
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\mssqllocaldb;Database=aspnet5-TestWepApp-e35abc53-9a43-4b2b-886d-d8582c0a1ccd;Trusted_Connection=True;MultipleActiveResultSets=true"
}
},
这是我的 DBContext 使用空构造函数时使用的 DefaultConnection。
现在,Azure 连接字符串映射到 Data:NAME:ConnectionString。于是我们看到了对应关系。
所需要做的就是命名 Azure 连接字符串 "DefaultConnection" 并确保环境变量包含在配置中(默认情况下是这样)并且一切都按预期工作。
configuration.AddJsonFile("config.json")
// ...
configuration.AddEnvironmentVariables()
所以当加载配置时,Data:DefaultConnection:ConnectionString的config.json值将被Azure设置的环境变量替换,因为AddEnvironmentVariables是在config.json加载到配置。
更新
使用 OP 的脚本查看调试值后,我没有看到列出的连接字符串。
问题是键是分层的。这是应该显示所有键的更新代码:
@*
For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
// ViewBag.Title = "Home Page";
}
@inject Microsoft.Framework.ConfigurationModel.Configuration config;
@functions{
public IEnumerable<string> GetAllKeys()
{
var keys = new List<string>();
foreach (var k in config.GetSubKeys())
{
GetAllKeys(keys, k.Key);
}
return keys;
}
public void GetAllKeys(List<string> keys, string key)
{
keys.Add(key);
foreach (var k in config.GetSubKeys(key))
{
GetAllKeys(keys, key + ":" + k.Key);
}
}
}
<dl>
@foreach (var key in GetAllKeys())
{
<dt>@key</dt>
<dd>@config.Get(key)</dd>
}
</dl>
我发现下面的方法最简单。它确实消除了将连接字符串置于源代码管理中的风险。与设置环境变量相比,我不确定它在安全方面的评级如何。
- 在 Azure 门户中,将网站的 ASPNET_Env 环境变量设置为 'Production'。
- 使用 Azure 门户中显示的 FTP 地址确保 FTP 访问该网站。请注意,Azure 门户有一个安全的 FTP 和一个非安全的 FTP 端点。一定要使用安全的。 (您可能需要通过 Azure 门户 'reset deployment credentials' 来设置 FTP 密码。)
- 找到 appsettings.json 文件所在的位置:'approot/src/'。复制到 'appsettings.Production.json'.
- 在 'appsettings.Production.json' 中,将连接字符串更改为生产数据库的连接字符串。
- 在您的 ASP.NET 5 项目的启动 class 中:
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true);
在ASP.NET5中,我们如何以编程方式访问Azure Web App的连接字符串?我已经能够检索 TEST_APP_SETTINGS
值,但不能检索 TestConnString
值。
这是我尝试过的:
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
恐怕 AppSettings
不存在。我也这样做了,应用程序设置出现了,但连接字符串没有。
Startup.cs
// Setup configuration sources.
Configuration = new Configuration()
.AddJsonFile("config.json")
.AddEnvironmentVariables();
// Allow access from *.cshtml
services.AddSingleton<Configuration>(provider =>
{
return Configuration as Configuration;
});
Dev.cshtml
@inject Microsoft.Framework.ConfigurationModel.Configuration config;
<dl>
@foreach(var k in @config.GetSubKeys())
{
<dt>@k.Key</dt>
<dd>@config.Get(k.Key)</dd>
}
</dl>
连接字符串设置为环境变量。因此,首先您必须 add the environment variable configuration source,然后连接字符串将被命名为 Data:NAME:ConnectionString
,其中 NAME
是门户中连接字符串的名称。
例如,如果您的连接字符串是 "ServerConnection",那么您可以使用 Data:ServerConnection:ConnectionString
Here 是验证映射环境配置映射的测试,他们可能会更好地解释它。
这是 Victor 回答的扩展,它帮助我了解了新 MVC 6 环境中发生的事情。
在 config.json 文件中我有这个:
"Data": {
"DefaultConnection": {
"ConnectionString": "Server=(localdb)\mssqllocaldb;Database=aspnet5-TestWepApp-e35abc53-9a43-4b2b-886d-d8582c0a1ccd;Trusted_Connection=True;MultipleActiveResultSets=true"
}
},
这是我的 DBContext 使用空构造函数时使用的 DefaultConnection。
现在,Azure 连接字符串映射到 Data:NAME:ConnectionString。于是我们看到了对应关系。
所需要做的就是命名 Azure 连接字符串 "DefaultConnection" 并确保环境变量包含在配置中(默认情况下是这样)并且一切都按预期工作。
configuration.AddJsonFile("config.json")
// ...
configuration.AddEnvironmentVariables()
所以当加载配置时,Data:DefaultConnection:ConnectionString的config.json值将被Azure设置的环境变量替换,因为AddEnvironmentVariables是在config.json加载到配置。
更新
使用 OP 的脚本查看调试值后,我没有看到列出的连接字符串。
问题是键是分层的。这是应该显示所有键的更新代码:
@*
For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
// ViewBag.Title = "Home Page";
}
@inject Microsoft.Framework.ConfigurationModel.Configuration config;
@functions{
public IEnumerable<string> GetAllKeys()
{
var keys = new List<string>();
foreach (var k in config.GetSubKeys())
{
GetAllKeys(keys, k.Key);
}
return keys;
}
public void GetAllKeys(List<string> keys, string key)
{
keys.Add(key);
foreach (var k in config.GetSubKeys(key))
{
GetAllKeys(keys, key + ":" + k.Key);
}
}
}
<dl>
@foreach (var key in GetAllKeys())
{
<dt>@key</dt>
<dd>@config.Get(key)</dd>
}
</dl>
我发现下面的方法最简单。它确实消除了将连接字符串置于源代码管理中的风险。与设置环境变量相比,我不确定它在安全方面的评级如何。
- 在 Azure 门户中,将网站的 ASPNET_Env 环境变量设置为 'Production'。
- 使用 Azure 门户中显示的 FTP 地址确保 FTP 访问该网站。请注意,Azure 门户有一个安全的 FTP 和一个非安全的 FTP 端点。一定要使用安全的。 (您可能需要通过 Azure 门户 'reset deployment credentials' 来设置 FTP 密码。)
- 找到 appsettings.json 文件所在的位置:'approot/src/'。复制到 'appsettings.Production.json'.
- 在 'appsettings.Production.json' 中,将连接字符串更改为生产数据库的连接字符串。
- 在您的 ASP.NET 5 项目的启动 class 中:
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true);