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!
Pour ce faire, la meilleure solution consiste à ajouter une chaîne de connexion à partir du portail Azure:
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.
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;
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.
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.
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.
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
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());
}
}
}
var connString = ConfigurationManager.ConnectionStrings["myDBEntities"].ConnectionString; using (var dbContext = new myDBEntities(connString)) { //TODO: }
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/
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é
local.settings.json
, spécifiez vos chaînes de connexion dans le noeud Values
.portal.Azure.com > your Azure Function > function node > Application Settings
GetEnvironmentVariable
à partir de votre fonction Azure (impossible d'obtenir stackoverflow pour afficher ce code correctement)C'est tout.
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?
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/
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: CosmosDBConnection
Value: 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){
.....
}
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 fichierlocal.settings.json
. Cela fonctionnera en conséquence. Voir la capture d'écran ci-dessous:
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; }