76

如何app.config在 Azure 函数中添加或访问文件以添加数据库连接字符串?

如果您不应该添加一个app.config并且有更好的方法来访问外部数据库以执行该功能,请告诉我最佳实践。谢谢!

4

14 回答 14

67

Jan_V几乎成功了,这让我在local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

这使您可以使用ConfigurationManager.ConnectionStrings[]我们都习惯的。

var sqlConnection = ConfigurationManager
                   .ConnectionStrings["MyConnectionString"].ConnectionString;
于 2017-08-07T21:12:31.070 回答
35

最好的方法是从 Azure 门户添加连接字符串:

  • 在您的 Function App UI 中,单击 Function App 设置
  • 设置/应用程序设置
  • 添加连接字符串

然后,它们将使用与 web.config 中相同的逻辑可用,例如

var conn = System.Configuration.ConfigurationManager
                 .ConnectionStrings["MyConn"].ConnectionString;

或者,如果您使用的是非 .NET 语言,则可以改用应用程序设置,它会在运行时成为您的函数可以访问的简单环境变量。

于 2016-05-13T17:09:30.780 回答
25

Todd De Land 的回答仅适用于当地环境。但是,根据此文档,已发布的 Azure 函数需要将连接字符串存储为应用设置并由GetEnvironmentVariable.

添加System.Configuration程序集引用是不必要的。

string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);

以下是使环境字符串可在本地和已发布环境中检索步骤

  1. 要支持本地环境,请在节点中local.settings.json指定您的连接字符串Values

local.settings.json 图片

  1. 要支持已发布的环境,请转到portal.azure.com > your Azure Function > function node > Application Settings

应用程序设置

添加我的连接字符串

  1. 最后,GetEnvironmentVariable从您的 Azure 函数调用(无法让 stackoverflow 正确显示此代码)

在此处输入图像描述

而已。

于 2018-07-28T21:21:55.123 回答
25

在 Functions Runtime v2 中,配置管理器将被新的 Asp.Net Core 配置系统所取代。

因此,如果您使用的是 .Net Core,您应该关注 John Gallants 博客文章: https ://blog.jongallant.com/2018/01/azure-function-config/

  • 与 Azure Function 中的 local.settings.json 和 Settings 一起使用
  • 适用于应用程序设置和连接字符串
于 2018-06-04T06:30:17.853 回答
17

我在这里经历了几个类似的问题和答案。他们中的许多人要么具有误导性,要么假设每个人都处于同一水平并且了解 azure 函数的工作原理。像我这样的新手没有答案。我想在这里一步一步总结我的解决方案。

  1. 最重要的是我们了解 local.settings.json 文件不适合 AZURE。顾名思义,就是在本地运行您的应用程序。所以解决方案与这个文件无关。

  2. App.Config 或 Web.Config 不适用于 Azure 函数连接字符串。如果您有数据库层库,则不能像在 Asp.Net 应用程序中那样使用其中任何一个覆盖连接字符串。

  3. 为了使用,您需要Application Settings在 Azure 函数中的 azure 门户上定义连接字符串。有连接字符串。在那里你应该复制你的 DBContext 的连接字符串。如果是 edmx,它将如下所示。有连接类型,我使用它 SQlAzure,但我使用自定义测试(有人声称仅适用于自定义)两者都适用。

metadata=res:// /Models.myDB.csdl|res:// /Models.myDB.ssdl|res://*/Models.myDB.msl;provider=System.Data.SqlClient;provider connection string='data source=[yourdbURL];initial catalog=myDB;persist security info=True;user id=xxxx;password=xxx;MultipleActiveResultSets=True;App=EntityFramework

  1. 设置完成后,您需要读取应用程序中的 url 并提供 DBContext。DbContext 实现了一个带有连接字符串参数的构造函数。默认构造函数没有任何参数,但你可以扩展它。如果您使用的是 POCO 类,则可以简单地修改 DbContext 类。如果你像我一样使用数据库生成的 Edmx 类,你不想接触自动生成的 edmx 类,而是想在同一个命名空间中创建部分类并扩展这个类,如下所示。

这是自动生成的 DbContext

namespace myApp.Data.Models
{   

    public partial class myDBEntities : DbContext
    {
        public myDBEntities()
           : base("name=myDBEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

}

这是新的部分类,您创建

namespace myApp.Data.Models
{
    [DbConfigurationType(typeof(myDBContextConfig))]
    partial class myDBEntities
    {

        public myDBEntities(string connectionString) : base(connectionString)
        {
        }
    }

      public  class myDBContextConfig : DbConfiguration
        {
            public myDBContextConfig()
            {
                SetProviderServices("System.Data.EntityClient", 
                SqlProviderServices.Instance);
                SetDefaultConnectionFactory(new SqlConnectionFactory());
            }
        }
    }
  1. 毕竟,您可以从 azure 设置中获取连接字符串,在您的 Azure Function 项目中使用下面的代码并向您的 DbContext 提供 myDBEntities 是您在 azure 门户中为连接字符串提供的名称。
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;


 using (var dbContext = new myDBEntities(connString))
{
        //TODO:
}
于 2018-01-08T14:52:18.040 回答
11

除了@ToddDeLand 的答案。

local.settings.json这样:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

然后,您可以像这样访问您的连接字符串,不需要 NuGet。

var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:MyConnectionString");

Microsoft 在这里推荐这种方法:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables

如果将连接字符串添加到值:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": "",
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

您可以像这样访问您的连接字符串:

var connectionString = Environment.GetEnvironmentVariable("MyConnectionString");

资料来源:

https://stackoverflow.com/a/52219491/3850405

https://github.com/Azure/Azure-Functions/issues/717#issuecomment-400098791

于 2020-06-03T09:13:27.650 回答
4

我相信常见的做法是为 azure 函数使用环境变量,然后您可以在 Azure Function 中设置环境变量:

(功能应用设置 -> 配置应用设置 -> 应用设置部分)

如果您也可以让我们知道您使用的是哪种语言,也许会更有帮助?

于 2017-03-07T02:18:59.933 回答
2

我在我的本地数据库上尝试了下面的代码片段,这看起来很简单。我们来看一下。

Nuget扩展:

Nuget Package Manager从您的项目Dependencies部分下载以下参考

using System.Data.SqlClient;

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "sqldb_connection": "Data Source=.;Initial Catalog=DatabaseName;Connection Timeout=30;Integrated Security=True;"
  }
}

读取函数体上的连接:

//读取数据库连接

        var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");

使用连接字符串的函数读写操作:

// Convert all request perameter into Json object

                var content = req.Content;
                string jsonContent = content.ReadAsStringAsync().Result;
                dynamic requestPram = JsonConvert.DeserializeObject<AzureSqlTableClass>(jsonContent);

                // Validate required param

                if (string.IsNullOrEmpty(requestPram.FirstName))
                {
                    return req.CreateResponse(HttpStatusCode.OK, "Please enter First Name!");
                }
                if (string.IsNullOrEmpty(requestPram.LastName))
                {
                    return req.CreateResponse(HttpStatusCode.OK, "Please enter Last Name!");
                }



                //Read database Connection

                var sqlConnection = Environment.GetEnvironmentVariable("sqldb_connection");
                var responseResults = 0;

                //Read Write Uisng Connection String

                using (SqlConnection conn = new SqlConnection(sqlConnection))
                {
                    conn.Open();
                    var text = "INSERT INTO AzureSqlTable VALUES ('" + requestPram.FirstName + "', '" + requestPram.LastName + "', '" + requestPram.Email + "') ";

                    using (SqlCommand cmd = new SqlCommand(text, conn))
                    {
                        responseResults = await cmd.ExecuteNonQueryAsync();
                    }
                    conn.Close();
                }

                return req.CreateResponse(HttpStatusCode.OK, responseResults);

注意:在发布您的函数时,azure portal只需替换local.settings.json文件中的连接字符串。它会相应地工作。请看下面的屏幕截图:

在此处输入图像描述

于 2019-06-10T07:22:52.283 回答
2

试试这个方法。

public static string GetConnectionString(string name)
{
    string conStr = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{name}", 
                    EnvironmentVariableTarget.Process);

    // Azure Functions App Service naming 
    if (string.IsNullOrEmpty(conStr))convention
        conStr = System.Environment.GetEnvironmentVariable($"SQLAZURECONNSTR_{name}", 
                 EnvironmentVariableTarget.Process);

    return conStr;
}
于 2019-07-19T11:23:19.093 回答
2

上述一些建议有效。但是,有一种更直接的方式来设置连接字符串。这是通过使用点击发布设置后看到的“发布”屏幕。在此处查看文档中的图片 在此处输入图像描述

于 2019-09-05T22:20:21.890 回答
2

如果您使用的是函数运行时 v3,那么以下方法将适用于您。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}

在函数的启动文件中

public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
    var config = builder.ConfigurationBuilder.Build();
    var connectionString = config.GetConnectionString("MyConnectionString");
}
于 2020-09-30T18:10:32.937 回答
1

处理连接字符串的最佳方式是使用“Azure Key Vault”。您可以将所有重要机密存储在 Key Vault 中并在应用程序中使用。根据其他成员的建议,您可以使用应用程序设置。

帮助完整链接:https ://docs.microsoft.com/en-us/azure-stack/user/azure-stack-key-vault-manage-portal?view=azs-2002

https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-3.1

于 2020-05-29T05:45:33.590 回答
0

您应该将连接字符串存储在 azure key vault 中,并在 azure 功能上启用 MSI,并在 azure key vault 上添加访问策略以读取密钥值。

于 2019-06-08T17:09:01.410 回答
0

下面为我​​在本地和 Azure 中用于查询 cosmos db 的 http 触发器函数

Microsoft.Azure.WebJobs.Extensions.CosmosDB nuget 包引用添加到项目

连接字符串设置:

local.settings.json

{
  "ConnectionStrings": {
    "CosmosDBConnection": "AccountEndpoint=foobar;"
  }
}

Azure 门户>功能应用>平台功能>配置>应用程序设置>新应用程序设置> Name: CosmosDBConnection Value: AccountEndpoint=foobar; 更新>保存

示例 c# Azure 函数

public static async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
           [CosmosDB(databaseName:"dbName",
                     collectionName:"collectionName",
                     ConnectionStringSetting = "CosmosDBConnection")] DocumentClient documentClient, 
           ILogger log){
             .....
           }
于 2019-05-03T04:24:03.737 回答