web-dev-qa-db-fra.com

Lire les paramètres personnalisés à partir de local.settings.json dans les fonctions Azure

J'essaie de récupérer un paramètre personnalisé à partir du fichier local.settings.json. Exemple J'essaie de lire la liste des tableaux présents dans le fichier local.settings.json ci-dessous

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "AzureWebJobsDashboard": "UseDevelopmentStorage=true",
    "TableList": "TestTableName1,TestTableName2"
  }
}

En utilisant le code suivant, je le lis

string tableslist = ConfigurationManager.AppSettings["TableList"];

et cela fonctionne, mais j'ai lu à quelques endroits que cela ne fonctionne que lors du débogage local, il peut ne pas fonctionner après son déploiement, dans un environnement de production. Quelqu'un pourrait-il m'indiquer comment procéder correctement? Ou le problème ne s'applique qu'aux paramètres liés à la chaîne de connexion?

7
Pரதீப்

@Kirk et @Slava vous ont aidé à vous débarrasser de la confusion. Ajoutez juste quelques détails pour que vous puissiez vous référer.

Par défaut, la publication ne télécharge pas local.settings.json sur Azure, ni ne modifie les paramètres d'application en fonction de ce fichier local, nous devons donc les mettre à jour manuellement sur le portail Azure. Nous pouvons également le faire sur le panneau de publication VS (créez d'abord un profil si nous devons modifier les paramètres avant de publier).

enter image description here

À propos de la façon d'obtenir des paramètres dans les paramètres de l'application, une chose à noter est que ConfigurationManager n'est plus pris en charge dans la fonction v2 (runtime beta), ne peut obtenir que null ou exception avec. Pour la fonction v1 (runtime ~ 1), cela fonctionne toujours.

  1. Pour la fonction v1

    Pour lire les paramètres d'application sur Azure (également Values dans local.settings.json), System.Environment.GetEnvironmentVariable($"{parameterName}") est recommandé.

    Tournez-vous vers les chaînes de connexion, malheureusement GetEnvironmentVariable ne fonctionne que sur Azure car les chaînes de connexion (ConnectionStrings dans local.settings.json) ne sont pas importées dans les variables d'environnement. Nous avons donc besoin de ConfigurationManager, qui fonctionne à la fois dans Azure et dans l'environnement local. Bien sûr, il peut également lire les paramètres de l'application.

  2. Pour la fonction v2, deux choix pour les paramètres d'application et les chaînes de connexion.

    L'une consiste à utiliser GetEnvironmentVariable. Nous pouvons faire référence à cette liste pour les préfixes de la chaîne de connexion sur Azure.

    // Get Application settings
    var appParameter= "AzureWebJobsStorage";
    System.Environment.GetEnvironmentVariable($"{appParameter}");
    
    // Get Connection strings(put local and Azure env together)
    var connParameter= "MySqlAzureConnection";
    var Prefix = "SQLAZURECONNSTR_";
    var connectionString = System.Environment.GetEnvironmentVariable($"ConnectionStrings:{connParameter}");
    if(string.IsNullOrEmpty(connectionString )){
       connectionString = System.Environment.GetEnvironmentVariable($"{Prefix}{connParameter}");
    }
    

    Une autre consiste à utiliser ConfigurationBuilder. Ajoutez le paramètre ExecutionContext, qui est utilisé pour localiser le répertoire de l'application de fonction.

    [FunctionName("FunctionName")]
    public static void Run(...,ExecutionContext context)
    {
       //"Values" and "Connection" sections are injected into EnvironmentVariables automatically hence we don't need to load Json file again. 
       //Hence SetBasePath and AddJsonFile are only necessary if you have some custom settings(e.g. nested Json rather than key-value pairs) outside those two sections. It's recommended to put those setting to another file if we need to publish them.
       //Note that Function binding settings(e.g. Storage Connection String) must be EnvironmentVariables, i.e. must be stored in "Values" section.
        var config = new ConfigurationBuilder()
            .SetBasePath(context.FunctionAppDirectory)
            .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
    
        // Get Application Settings
        var appParameter= "AzureWebJobsStorage";
        string appsetting = config[$"{appParameter}"];
    
        // Get Connection strings
        var connParameter= "MySqlAzureConnection";
        string connectionString = config.GetConnectionString($"{connParameter}");
    }
    
14
Jerry Liu

Lors de l'utilisation de Environment.GetEnvironmentVariable dans une fonction Azure Core .Net, j'ai dû ajouter le paramètre EnvironmentVariableTarget.Process pour récupérer la chaîne de connexion

 string connectionString= Environment.GetEnvironmentVariable("DBConnectionString", 
 EnvironmentVariableTarget.Process);

Mon local.settings.json ressemblait à ceci:

 {"IsEncrypted": false,
 "Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"DBConnectionString": "<conn string here>"
 }
}
0