Azure函数数据库连接字符串

时间:2016-05-13 16:30:34

标签: c# azure azure-functions

如何向Azure功能添加或访问app.config文件以添加数据库连接字符串?如果您不应该添加app.config并且有更好的方法来访问外部数据库来执行该功能,请告诉我最佳实践。谢谢!

15 个答案:

答案 0 :(得分:34)

执行此操作的最佳方法是从Azure门户添加连接字符串:

  • 在功能应用UI中,单击“功能应用设置”
  • 设置/应用程序设置
  • 添加连接字符串

然后,它们将使用与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)

我在这里经历了几个类似的问题和答案。他们中的许多人要么误导,要么假设每个人都处于同一水平,并且了解天蓝色功能是如何运作的。像我这样的新手没有答案。我想在此总结一下我的解决方案。

  1. 最重要的是我们了解local.settings.json文件 不是为了AZURE。它是在本地运行您的应用程序名称 清楚地说。所以解决方案与此文件无关。

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

  3. 为了使用,您需要在Azure功能的Application Settings下的Azure文档中定义连接字符串。有 连接字符串。你应该复制你的DBContext的连接字符串。如果它是edmx,它将如下所示。有连接类型,我使用它SQlAzure但我用Custom测试(有人声称只适用于自定义)适用于两者。

  4.   

    元数据= 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

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

  • 使用local.settings.json和Azure功能中的设置
  • 使用应用设置和连接字符串

答案 4 :(得分:8)

Todd De Land的答案仅适用于当地环境。但是,根据此doc,发布的Azure Function需要将连接字符串存储为应用程序设置并由GetEnvironmentVariable检索。

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

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

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

  1. 要支持本地环境,请在local.settings.json的{​​{1}}节点内指定连接字符串

local.settings.json picture

  1. 要支持发布的环境,请转到Values

Application Settings

Add MyConnectionString

  1. 最后,从您的Azure函数调用portal.azure.com > your Azure Function > function node > Application Settings(不能获取stackoverflow以正确显示此代码)

enter image description here

就这样。

答案 5 :(得分:3)

在@ToddDeLand中添加答案。

使用这样的await randsleep(caller=f"Producer {name}")

local.settings.json

然后您可以像这样访问连接字符串,而无需NuGet。

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

Microsoft在此推荐这种方法:

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

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

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 enter image description 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文件上的连接字符串即可。会工作的   相应地。请参见以下屏幕截图:

enter image description here

答案 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");
}