web-dev-qa-db-fra.com

Chaîne de connexion à la base de données Azure Functions

Comment ajouter ou accéder à un fichier app.config aux fonctions Azure pour ajouter une chaîne de connexion à la base de données? Si vous n'êtes pas supposé ajouter un app.config et qu'il existe un meilleur moyen d'accéder à une base de données externe pour exécuter la fonction, veuillez me le faire savoir. Merci!

40
Lereveme

Pour ce faire, la meilleure solution consiste à ajouter une chaîne de connexion à partir du portail Azure:

  • Dans l'interface utilisateur de votre fonction, cliquez sur Paramètres de la fonction
  • Paramètres/Paramètres d'application
  • Ajouter des chaînes de connexion

Ils seront alors disponibles en utilisant la même logique que s’ils se trouvaient dans un fichier web.config, par ex.

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

Ou, si vous utilisez un langage autre que .NET, vous pouvez utiliser les paramètres de l'application, qui deviennent de simples variables d'environnement à l'exécution auxquelles vos fonctions peuvent accéder.

34
David Ebbo

Jan_V presque cloué dessus, ce qui m'a amené à expérimenter cela dans le local.settings.json

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

Cela vous permet d'utiliser le ConfigurationManager.ConnectionStrings[] auquel nous sommes tous habitués.

var sqlConnection = ConfigurationManager
                   .ConnectionStrings["MyConnectionString"].ConnectionString;
32
Todd DeLand

Je suis passé par plusieurs questions et réponses similaires ici. Nombre d'entre eux sont trompeurs ou supposent que tout le monde est au même niveau et comprend le fonctionnement des fonctions Azure. il n'y a pas de réponse pour les débutants comme moi. Je voudrais résumer ici ma solution étape par étape.

  1. le plus important, c’est que nous comprenions le fichier local.settings.jsonIS PAS POUR Azure. il s'agit d'exécuter votre application dans la section locale comme son nom l'indique clairement. La solution n’a donc rien à voir avec ce fichier.

  2. App.Config ou Web.Config ne fonctionne pas pour les chaînes de connexion de fonction Azure. Si vous disposez d'une bibliothèque de couches de base de données, vous ne pouvez pas écraser la chaîne de connexion à l'aide de l'une de ces méthodes, comme vous le feriez dans les applications Asp.Net.

  3. Pour pouvoir travailler avec, vous devez définir votre chaîne de connexion sur le portail Azure sous le Application Settings dans votre fonction Azure. Il y a des chaînes de connexion Là, vous devriez copier votre chaîne de connexion de votre DBContext. si c'est edmx, cela ressemblera à celui ci-dessous. Il y a un type de connexion, je l'utilise SQlAzure mais j'ai testé avec Custom (quelqu'un a prétendu ne fonctionne qu'avec custom) fonctionne avec les deux. 

metadata = res: // /Models.myDB.csdl|res:// / Models.myDB.ssdl | res: //*/Models.myDB.msl; provider = System.Data.SqlClient; provider chaîne de connexion = 'source de données = [yourdbURL]; initial catalog = myDB; informations de sécurité persistantes = True; utilisateur id = xxxx; mot de passe = xxx; MultipleActiveResultSets = True; App = EntityFramework

  1. Après avoir configuré cela, vous devez lire l'URL dans votre application et fournir le DBContext. DbContext implémente un constructeur avec un paramètre de chaîne de connexion. Par défaut, le constructeur est sans paramètre mais vous pouvez l'étendre. Si vous utilisez des classes POCO, vous pouvez modifier simplement la classe DbContext. Si vous utilisez les classes Edmx générées par la base de données comme je le fais, vous ne souhaitez pas toucher aux classes edmx générées automatiquement, mais créer une classe partielle dans le même espace de nom et étendre cette classe comme ci-dessous.

Ceci est généré automatiquement DbContext

namespace myApp.Data.Models
{   

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

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

}

c'est la nouvelle classe partielle, vous créez

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. Après tout, vous pouvez obtenir la chaîne de connexion à partir des paramètres Azure, dans votre projet Azure Function avec le code ci-dessous et fournir à votre DbContext MyDBEntities est le nom que vous avez donné dans le portail Azure pour votre chaîne de connexion.
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString;


 using (var dbContext = new myDBEntities(connString))
{
        //TODO:
}
12
batmaci

Configuration Manager sera remplacé par le nouveau système de configuration Asp.Net Core dans Functions Runtime v2. 

Donc, si vous utilisez .Net Core, vous devez suivre l’article du blog de John Gallants: https://blog.jongallant.com/2018/01/Azure-function-config/

  • Fonctionne avec local.settings.json et les paramètres dans Azure Function
  • Fonctionne avec les paramètres de l'application et les chaînes de connexion
9
Johannes

La réponse de Todd De Land ne fonctionne que pour l'environnement local. Toutefois, selon ce doc , Azure Function publié nécessite que les chaînes de connexion soient stockées en tant que paramètres d’application et extraites par GetEnvironmentVariable.

L'ajout de System.Configuration à la référence d'assemblage est inutile.

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

Voici les étapes à suivre pour rendre les chaînes d'environnement récupérables pour les environnements local et publié

  1. Pour prendre en charge l'environnement local, dans local.settings.json, spécifiez vos chaînes de connexion dans le noeud Values.

 local.settings.json picture

  1. Pour prendre en charge l'environnement publié, allez à portal.Azure.com > your Azure Function > function node > Application Settings

 Application Settings

 Add MyConnectionString

  1. Enfin, appelez GetEnvironmentVariable à partir de votre fonction Azure (impossible d'obtenir stackoverflow pour afficher ce code correctement)

 enter image description here

C'est tout.

5
Jeson Martajaya

Je pense que la pratique courante consiste à utiliser des variables d'environnement pour les fonctions Azure. Vous pouvez ensuite les configurer dans la fonction Azure:

(Fonction Paramètres de l'application -> Configurer les paramètres de l'application -> Section Paramètres de l'application)

Ce serait peut-être plus utile si vous pouviez aussi nous dire quelle langue vous utilisez?

2
William Yeung

System.Configuration.ConfigurationManager ne fonctionne plus avec AzureFunctions . Vous devez plutôt utiliser ExecutionContext de Azure.WebJobs et importer un contexte avec les paramètres de Azure en tant que paramètre de la méthode Run.

Regardez dans cette explication: https://blog.jongallant.com/2018/01/Azure-function-config/

0
Wille Esteche

Ci-dessous, j'ai travaillé pour moi à la fois localement et dans Azure pour une fonction de déclenchement http qui interroge Cosmos

ajouté Microsoft.Azure.WebJobs.Extensions.CosmosDB Référence de package de nuget au projet

paramètres de chaîne de connexion:

local.settings.json

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

dans portail Azure > applications de fonction > fonctionnalités de la plateforme > configurations > Paramètres de l'application > Nouveaux paramètres de l'application > Name: CosmosDBConnectionValue: AccountEndpoint=foobar; mettre à jour > enregistrer

échantillon c # fonction Azure

public static async Task<IActionResult> Run(
           [HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequest req,
           [CosmosDB(databaseName:"dbName",
                     collectionName:"collectionName",
                     ConnectionStringSetting = "CosmosDBConnection")] DocumentClient documentClient, 
           ILogger log){
             .....
           }
0
ManiVI

J'ai essayé l'extrait de code ci-dessous sur ma base de données locale qui semble facile. Regardons.

Nuget Extention:

Téléchargez la référence suivante de Nuget Package Manager Sur votre projet Dependencies partie

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;"
  }
}

Lire la connexion dans le corps de la fonction:

// Lire la connexion à la base de données

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

Fonction Opération de lecture/écriture à l'aide d'une chaîne de connexion:

// 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);

Remarque: Pendant que vous publiez votre fonction sur Azure portal, remplacez simplement la chaîne de connexion sur le fichier local.settings.json. Cela fonctionnera en conséquence. Voir la capture d'écran ci-dessous:

enter image description here

0

Essayez cette méthode.

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

0
AhsanRazaUK