Azure函数数据库连接字符串

Ler*_*eme 55 c# azure azure-functions

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

Tod*_*and 41

Jan_V 差不多把它钉了下来,这让我在这里试验了这个local.settings.json

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}
Run Code Online (Sandbox Code Playgroud)

这允许您使用ConfigurationManager.ConnectionStrings[]我们都习惯的.

var sqlConnection = ConfigurationManager
                   .ConnectionStrings["MyConnectionString"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)

  • 您还需要从Nuget中获取`System.Configuration.ConfigurationManager`以使其正常工作. (9认同)
  • @batmaci 是的,该文件仅用于本地调试。由于 Azure Functions 构建在应用服务之上,因此将连接字符串放在“应用程序设置”区域(有一个用于连接字符串的部分)。 (3认同)
  • local.settings.json文件甚至没有上传到Azure.怎么应该工作?我认为这是本地调试的文件 (2认同)

Dav*_*bbo 33

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

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

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

var conn = System.Configuration.ConfigurationManager
                 .ConnectionStrings["MyConn"].ConnectionString;
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是非.NET语言,则可以使用App Settings,它可以在运行时成为您的函数可以访问的简单环境变量.

  • 是的,我们可能应该默认引用它.我将与团队中的其他人讨论. (2认同)
  • 仅供参考我打开https://github.com/Azure/azure-webjobs-sdk-script/issues/374进行追踪. (2认同)

小智 19

Configuration Manager将由函数运行时v2中的新Asp.Net核心配置系统替换.

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

  • 与Azure功能中的local.settings.json和设置一起使用
  • 适用于应用程序设置和连接字符串


bat*_*aci 14

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

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

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

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

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();
        }

}
Run Code Online (Sandbox Code Playgroud)

这是你创建的新的部分类

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());
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 毕竟,您可以使用以下代码从Azure功能项目中获取连接字符串,并提供给您的DbContext myDBEntities是您在连接字符串的azure门户中提供的名称.
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;


 using (var dbContext = new myDBEntities(connString))
{
        //TODO:
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*aya 11

Todd De Land的回答仅适用于当地环境.但是,根据此文档,已发布的Azure功能需要将连接字符串存储为应用程序设置并通过检索GetEnvironmentVariable.

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

string cs = Environment.GetEnvironmentVariable("MyConnectionString",EnvironmentVariableTarget.Process);
Run Code Online (Sandbox Code Playgroud)

以下是使环境字符串检索的步骤局部和出版环境

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

local.settings.json图片

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

应用程序设置

添加MyConnectionString

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

在此输入图像描述

而已.

  • 您不应该将数据库连接字符串放在这里,它们应该放在 azure 和 local.settings.json 设置的连接字符串部分中 (2认同)
  • 我不同意@Anthony。使用ASP.NET Core时,您是正确的。但是,Azure函数的工作方式稍有不同,因为它们本身并不支持配置管理器。您可以以自定义方式添加它,但是将连接字符串扔到local.settings.json中的values对象中比较容易。 (2认同)

Ogg*_*las 11

除了@ToddDeLand 的回答。

有了local.settings.json这样的:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": ""
  },
  "ConnectionStrings": {
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings:MyConnectionString");
Run Code Online (Sandbox Code Playgroud)

微软在这里推荐这种方法:

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

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

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true;",
    "AzureWebJobsDashboard": "",
    "MyConnectionString": "[YourConnectionStringHere]"
  }
}
Run Code Online (Sandbox Code Playgroud)

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

var connectionString = Environment.GetEnvironmentVariable("MyConnectionString");
Run Code Online (Sandbox Code Playgroud)

资料来源:

/sf/answers/3655364401/

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

  • Environment.GetEnvironmentVariable("ConnectionStrings:MyConnectionString") 对我有用。谢谢大时间! (2认同)