如何向Azure功能添加或访问app.config文件以添加数据库连接字符串?如果您不应该添加app.config并且有更好的方法来访问外部数据库来执行该功能,请告诉我最佳实践。谢谢!
答案 0 :(得分:34)
执行此操作的最佳方法是从Azure门户添加连接字符串:
然后,它们将使用与web.config中相同的逻辑,例如
var conn = System.Configuration.ConfigurationManager
.ConnectionStrings["MyConn"].ConnectionString;
或者,如果您使用的是非.NET语言,则可以使用App Settings,它可以在运行时成为您的函数可以访问的简单环境变量。
答案 1 :(得分:34)
Jan_V 几乎钉了它,这让我在local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": ""
},
"ConnectionStrings": {
"MyConnectionString": "[YourConnectionStringHere]"
}
}
这允许您使用我们已经习惯的ConfigurationManager.ConnectionStrings[]
。
var sqlConnection = ConfigurationManager
.ConnectionStrings["MyConnectionString"].ConnectionString;
答案 2 :(得分:13)
我在这里经历了几个类似的问题和答案。他们中的许多人要么误导,要么假设每个人都处于同一水平,并且了解天蓝色功能是如何运作的。像我这样的新手没有答案。我想在此总结一下我的解决方案。
最重要的是我们了解local.settings.json文件 不是为了AZURE。它是在本地运行您的应用程序名称 清楚地说。所以解决方案与此文件无关。
App.Config或Web.Config不适用于Azure功能连接字符串。如果您有数据库层库,则无法像使用Asp.Net应用程序那样使用其中任何一个覆盖连接字符串。
为了使用,您需要在Azure功能的Application Settings
下的Azure文档中定义连接字符串。有
连接字符串。你应该复制你的DBContext的连接字符串。如果它是edmx,它将如下所示。有连接类型,我使用它SQlAzure但我用Custom测试(有人声称只适用于自定义)适用于两者。
元数据= RES:// /Models.myDB.csdl|res:// /Models.myDB.ssdl|res://*/Models.myDB.msl;provider=System。 Data.SqlClient提供方 连接字符串='数据源= [yourdbURL];初始 catalog = myDB; persist security info = True;用户 ID = XXXX;密码= XXX; MultipleActiveResultSets = TRUE;应用=的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: }
答案 3 :(得分:13)
Configuration Manager将被功能运行时v2中的新Asp.Net核心配置系统取代。
因此,如果您使用.Net Core,您应该关注John Gallants博客文章: https://blog.jongallant.com/2018/01/azure-function-config/
答案 4 :(得分:8)
Todd De Land的答案仅适用于当地环境。但是,根据此doc,发布的Azure Function需要将连接字符串存储为应用程序设置并由GetEnvironmentVariable
检索。
添加System.Configuration
程序集引用是不必要。
string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);
以下是使 本地和已发布环境均可检索环境字符串的步骤
local.settings.json
的{{1}}节点内指定连接字符串Values
portal.azure.com > your Azure Function > function node > Application Settings
(不能获取stackoverflow以正确显示此代码)就这样。
答案 5 :(得分:3)
在@ToddDeLand中添加答案。
使用这样的await randsleep(caller=f"Producer {name}")
:
local.settings.json
然后您可以像这样访问连接字符串,而无需NuGet。
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": ""
},
"ConnectionStrings": {
"MyConnectionString": "[YourConnectionStringHere]"
}
}
Microsoft在此推荐这种方法:
如果将连接字符串添加到值:
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:MyConnectionString");
您可以这样访问您的连接字符串:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true;",
"AzureWebJobsDashboard": "",
"MyConnectionString": "[YourConnectionStringHere]"
}
}
来源:
https://stackoverflow.com/a/52219491/3850405
https://github.com/Azure/Azure-Functions/issues/717#issuecomment-400098791
答案 6 :(得分:2)
我认为通常的做法是将环境变量用于azure函数,然后可以在Azure函数中设置环境变量:
(功能应用设置 - >配置应用设置 - >应用设置部分)
如果您也可以告诉我们您使用的是哪种语言,也许会更有帮助?
答案 7 :(得分:1)
以上某些建议有效。但是,还有一种更直接的方法来设置连接字符串。这是通过使用“发布”屏幕,在点击“发布”设置后看到的。 see picture from documentation here
答案 8 :(得分: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
答案 9 :(得分:0)
System.Configuration.ConfigurationManager不再与AzureFunctions一起使用。 您应该改为使用Azure.WebJobs中的ExecutionContext,并使用Azure中的设置作为运行方法中的参数导入上下文。
看一下这个解释: https://blog.jongallant.com/2018/01/azure-function-config/
答案 10 :(得分:0)
下面在本地和Azure中为我工作的是用于查询cosmos数据库的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){
.....
}
答案 11 :(得分:0)
您应该将连接字符串存储在azure密钥库中,并在azure功能上启用MSI,并在azure密钥库中添加访问策略以读取密钥值。
答案 12 :(得分:0)
我在本地数据库上尝试了以下代码片段,这似乎很简单。让我们看看。
螺母扩展:
从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
文件上的连接字符串即可。会工作的 相应地。请参见以下屏幕截图:
答案 13 :(得分:0)
尝试此方法。
fmm
答案 14 :(得分:0)
如果您正在使用功能运行时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");
}