Comment stocker correctement les chaînes de connexion dans les variables d'environnement pour la récupération par la production ASP.Net Core applications MVC

Je suis en train de travailler sur un ASP.NET Noyau de l'application MVC et je rencontre un problème avec mon chaînes de connexion.

J'ai un ASPNETCORE_ENVIRONMENT variable définie à Production sur mon serveur de production et de mon serveur de production est un Windows Server 2012R2 exécutant IIS. J'ai aussi l'DotNetCore.1.0.4_1.1.1-WindowsHosting.exe installé sur le serveur de production.

Cours de développement, je suis en utilisant UserSecrets à tenir ma chaîne de connexion. Cela fonctionne correctement.

Pour la production, je veux que mon chaînes de connexion dans les variables d'environnement sur mon serveur de production et c'est là que je vais avoir un problème. Je soupçonne qu'il peut être dans la façon dont je suis la structuration de la variable d'environnement.

Lorsque j'essaie d'accéder à la base de données en production, j'ai un message d'erreur disant en gros qu'il ne peut pas ne peut pas analyser la chaîne de connexion.

An exception occurred in the database while iterating the results of a query.

System.ArgumentException: Keyword not supported: '"server'.
at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2 
parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms)
at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)

Si je mets de la chaîne de connexion dans appSettings.json, le serveur de production fonctionne très bien.

Donc, voici un exemple de mon appSettings.json fichier montrant la chaîne de connexion qui fonctionne dans la production;

{
  "ConnectionStrings": {
     "TestDb": "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
  },

    ...
    ...
    ...
  }
}

Si je le déploiement de cette appSettings.json fichier à la production, cela fonctionne bien.

Dans mon ASP.Net application de Base, dans le Démarrage.cs fichier, j'ai le texte suivant;

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        //For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets<Startup>();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();

}

Ma compréhension est que le dernier constructeur.ajouter... liste ont priorité, dans mon cas, si une chaîne de connexion qui existe dans l'environnement, il doit avoir la priorité sur quoi que ce soit dans appsettings.

Donc dans la production, si j'utilise la suite appSettings.fichier de configuration;

{
  "ConnectionStrings": {
     "TestDb": "Placeholder for connection string. Overridden by User Secrets in Development and Environment Variables in Production. "
  },

    ...
    ...
    ...
  }
}

Il ne devrait pas d'importance ce que j'ai comme valeur pour ConnectionStrings:TestDb dans ce appsettings.json fichier si j'ai une variable d'environnement pour la chaîne de connexion.

Énumérés ci-dessous est la variable d'environnement je suis aide;

Variable                    Value
ConnectionStrings:TestDb    "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"

Cependant, lorsque j'utilise cette configuration, j'obtiens une erreur lorsque je tente d'accéder à la base de données indiquant qu'il ne peut pas analyser la chaîne de connexion.

Je suppose que le problème est la façon que j'ai de la chaîne de connexion spécifié dans la variable d'environnement, mais après un certain temps, la recherche en ligne, je n'ai pas été en mesure de trouver un exemple de ce que la valeur de la variable devrait ressembler. Par exemple, dois-je mettre attaque et de fuite des guillemets simples autour de l'ensemble de la chaîne? Ne les différentes sections de la chaîne de connexion besoin de guillemets simples ou doubles?

Toute aide, comme un exemple d'une bonne chaîne de connexion définie dans une variable d'environnement, serait grandement apprécié.

Vous n'avez pas un appSettings.Production.config fichier pour la prod avec les paramètres?
Désolé, maintenant je le vois. Vous avez des guillemets dans votre chaîne de connexion, le message d'erreur dit-il aussi. '"server', il y a un " à la mendicité. Vous avez probablement ajouté " lorsque vous l'avez créé quelque part. c'est à dire $env:ConnectionStrings:MyDb = """Server=;""" mais correcte serait $env:ConnectionStrings:MyDb = "Server=;" qui est également confirmé par votre envirionment variable de sortie
Je suis de copier et de coller la chaîne de connexion directement dans la fenêtre "Nouveau Système Variable de la boîte de dialogue" qui fait partie du Système Propriétés du panneau de contrôle (j'.e Panneau de configuration -->Tous les Éléments du Panneau de configuration -->Système - >Paramètres Système Avancés -->Variables d'Environnement-->Variables Système-->Nouveau... --> Puis j'ai mis le nom de la variable à ASPNETCORE_TestDB et la valeur de la variable "TestDb": "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Mot de passe=motdepassetest;MultipleActiveResultSets=true", y compris le avant/après les guillemets. Ce obtient toujours l'erreur.
J'ai essayé la même chose mais sans attaque et de fuite des devis et que j'ai toujours l'erreur

OriginalL'auteur EiEiGuy | 2017-07-05