如何app.config
在 Azure 函数中添加或访问文件以添加数据库连接字符串?
如果您不应该添加一个app.config
并且有更好的方法来访问外部数据库以执行该功能,请告诉我最佳实践。谢谢!
如何app.config
在 Azure 函数中添加或访问文件以添加数据库连接字符串?
如果您不应该添加一个app.config
并且有更好的方法来访问外部数据库以执行该功能,请告诉我最佳实践。谢谢!
Jan_V几乎成功了,这让我在local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": ""
},
"ConnectionStrings": {
"MyConnectionString": "[YourConnectionStringHere]"
}
}
这使您可以使用ConfigurationManager.ConnectionStrings[]
我们都习惯的。
var sqlConnection = ConfigurationManager
.ConnectionStrings["MyConnectionString"].ConnectionString;
最好的方法是从 Azure 门户添加连接字符串:
然后,它们将使用与 web.config 中相同的逻辑可用,例如
var conn = System.Configuration.ConfigurationManager
.ConnectionStrings["MyConn"].ConnectionString;
或者,如果您使用的是非 .NET 语言,则可以改用应用程序设置,它会在运行时成为您的函数可以访问的简单环境变量。
Todd De Land 的回答仅适用于当地环境。但是,根据此文档,已发布的 Azure 函数需要将连接字符串存储为应用设置并由GetEnvironmentVariable
.
添加System.Configuration
程序集引用是不必要的。
string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);
以下是使环境字符串可在本地和已发布环境中检索的步骤
local.settings.json
指定您的连接字符串Values
portal.azure.com > your Azure Function > function node > Application Settings
GetEnvironmentVariable
从您的 Azure 函数调用(无法让 stackoverflow 正确显示此代码)而已。
在 Functions Runtime v2 中,配置管理器将被新的 Asp.Net Core 配置系统所取代。
因此,如果您使用的是 .Net Core,您应该关注 John Gallants 博客文章: https ://blog.jongallant.com/2018/01/azure-function-config/
我在这里经历了几个类似的问题和答案。他们中的许多人要么具有误导性,要么假设每个人都处于同一水平并且了解 azure 函数的工作原理。像我这样的新手没有答案。我想在这里一步一步总结我的解决方案。
最重要的是我们了解 local.settings.json 文件不适合 AZURE。顾名思义,就是在本地运行您的应用程序。所以解决方案与这个文件无关。
App.Config 或 Web.Config 不适用于 Azure 函数连接字符串。如果您有数据库层库,则不能像在 Asp.Net 应用程序中那样使用其中任何一个覆盖连接字符串。
为了使用,您需要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
这是自动生成的 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());
}
}
}
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString; using (var dbContext = new myDBEntities(connString)) { //TODO: }
除了@ToddDeLand 的答案。
像local.settings.json
这样:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": ""
},
"ConnectionStrings": {
"MyConnectionString": "[YourConnectionStringHere]"
}
}
然后,您可以像这样访问您的连接字符串,不需要 NuGet。
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:MyConnectionString");
Microsoft 在这里推荐这种方法:
如果将连接字符串添加到值:
{
"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
我相信常见的做法是为 azure 函数使用环境变量,然后您可以在 Azure Function 中设置环境变量:
(功能应用设置 -> 配置应用设置 -> 应用设置部分)
如果您也可以让我们知道您使用的是哪种语言,也许会更有帮助?
我在我的本地数据库上尝试了下面的代码片段,这看起来很简单。我们来看一下。
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
文件中的连接字符串。它会相应地工作。请看下面的屏幕截图:
试试这个方法。
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;
}
上述一些建议有效。但是,有一种更直接的方式来设置连接字符串。这是通过使用点击发布设置后看到的“发布”屏幕。在此处查看文档中的图片
如果您使用的是函数运行时 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");
}
处理连接字符串的最佳方式是使用“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
您应该将连接字符串存储在 azure key vault 中,并在 azure 功能上启用 MSI,并在 azure key vault 上添加访问策略以读取密钥值。
下面为我在本地和 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){
.....
}