在 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>

我发现下面的方法最简单。它确实消除了将连接字符串置于源代码管理中的风险。与设置环境变量相比,我不确定它在安全方面的评级如何。

  1. 在 Azure 门户中,将网站的 ASPNET_Env 环境变量设置为 'Production'。
  2. 使用 Azure 门户中显示的 FTP 地址确保 FTP 访问该网站。请注意,Azure 门户有一个安全的 FTP 和一个非安全的 FTP 端点。一定要使用安全的。 (您可能需要通过 Azure 门户 'reset deployment credentials' 来设置 FTP 密码。)
  3. 找到 appsettings.json 文件所在的位置:'approot/src/'。复制到 'appsettings.Production.json'.
  4. 在 'appsettings.Production.json' 中,将连接字符串更改为生产数据库的连接字符串。
  5. 在您的 ASP.NET 5 项目的启动 class 中:
var builder = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true);