从Azure函数中的配置文件加载连接字符串

时间:2017-01-30 19:26:07

标签: c# azure azure-functions

在我的Azure函数中,我正在使用一个库,它通过ConfigurationManager中的ConnectionString建立与SQL服务器的连接,如下所示:

var cs = System.Configuration.ConfigurationManager.ConnectionStrings["DbConString"].ConnectionString;
DbConnection connection = new SqlConnection(cs);

现在,当我通过应用程序设置在门户中设置连接字符串DbConString时,一切正常。但是对于本地开发我使用azure-functions-cli,遗憾的是我不知道应该在哪里放置连接字符串以通过ConfigurationManager正确加载它。

我已尝试将其放在appsettings.json文件中,但没有成功。

编辑: 我的appsettings.json目前看起来像这样:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": "",
    "MyServiceBusReader": "Endpoint=sb://xxxx=",
    "DbConStr1": "data source=(localdb)\\MSSQLLocalDB;initial catalog=MyDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework",
    "ConnectionStrings": {
      "DbConStr2": "data source=(localdb)\\MS..." 
    } 
  }
}

但是我无法访问" DbConStr1"通过ConfigurationManager。 添加" DbConStr2"在" ConnectionStrings"像描述here导致编译错误。也许是因为我没有使用.NET Core?

EDIT2: 我搞砸了" ConnectionStrings"的嵌套。它必须与"值":

处于相同的嵌套级别
{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "AzureWebJobsDashboard": "",
    "MyServiceBusReader": "Endpoint=sb://xxxx="
  },
  "ConnectionStrings": {
    "DbConStr": "data source=(localdb)\\MS..." 
  }
}

6 个答案:

答案 0 :(得分:4)

添加文件local.setting.json

enter image description here

  {
    {
      "IsEncrypted": false,
       "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "AzureWebJobsDashboard": "UseDevelopmentStorage=true",

      "tenantId": "You tenantId",
      "resource": "https://management.azure.com/",
      "ClientSecret": "You ClientSecret, Key from App Registry",
      "ClientId": "You ClientId, Application ID from App registry",

      "subscriptionId": "You subscriptionId",
      "resourceGroupName": "Your resourceGroupName",
      "serverName": " Your SQL Server",
      "databaseNameDW": "Your Database",
      "apiversion": "2017-10-01-preview"      
    }
}

在C#代码中使用:

private readonly static string tenantId = ConfigurationManager.AppSettings["tenantId"];

答案 1 :(得分:2)

我有同样的问题并使用.net标准(而非核心)。我将我的设置添加到Azure功能的应用程序设置部分(在Azure门户中): -

enter image description here

然后我下载了该功能的拉链: - enter image description here

此下载包含local.settings.json的副本,其中包含正确json格式的应用程序设置。然后我通过ConfigurationManager.Appsettings [“mysetting”]

访问它们

答案 2 :(得分:1)

问题是,连接字符串是从例如Web.config文件由两部分组成:

  • 连接字符串本身和
  • 提供商名称。

但由于配置文件使用JSON格式,因此无法指定这两个参数。

在提出问题时,无法在appsetings.json(现在重命名为local.settings.json)中设置提供商名称。但是Azure-Functions团队对此进行了更改,并将providerName的默认值设置为System.Data.SqlClient,从而解决了问题。

providerName默认为System.Data.SqlClient。您不必手动设置它。只需添加连接字符串 X ,然后通过ConfigurationManager.ConnectionStrings["X"]读取。

答案 3 :(得分:1)

我发现了一个感觉 hacky的方法,但是可以起作用:如果您评估Environment.GetEnvironmentVariables(),则可以发现local.settings.json中的所有连接字符串都可以用作Environment如果变量在本地运行,则前缀为"ConnectionStrings:",如果在Azure上运行,则前缀为"xxxCONNSTR_"的变量,因此可以定义此辅助函数:

    private static Array ConnectionStringKeyPrefixes = new[] { "ConnectionStrings:", "SQLCONNSTR_", "SQLAZURECONNSTR_", "MYSQLCONNSTR_", "POSTGRESQLCONNSTR_", "CUSTOMCONNSTR_" };
    public static string GetConnectionStringFromSettings(string connectionStringName)
    {
        string connectionString = null;

        foreach(string prefix in ConnectionStringKeyPrefixes) {
            connectionString = Environment.GetEnvironmentVariable($"{prefix}{connectionStringName}");

            if (!string.IsNullOrWhiteSpace(connectionString))
            {
                break;
            }
        }

        return connectionString;
    }

答案 4 :(得分:0)

您应该能够使用项目结构中的appsettings.json文件管理配置设置。您可以查看here以获取Azure Functions的文件夹结构示例。

此外,this链接将提供有关如何使用.NET Core管理配置设置的一些详细信息。

答案 5 :(得分:0)

// C# Environment Variables example for Azure Functions v1 or v2 runtime
// This works all the way up to but not including .NET Core 2.0
var clientId = Environment.GetEnvironmentVariable("ClientId");
var clientSecret = Environment.GetEnvironmentVariable("ClientSecret");
var aadDomain = Environment.GetEnvironmentVariable("AADDomain");

请记住,您在local.settings.json中所做的设置不会反映在蔚蓝中。请通过Azure门户在应用设置中添加您的值,然后点击链接- https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-use-azure-function-app-settings