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é.
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 sortieJe 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
Vous devez vous connecter pour publier un commentaire.
Il y a une faute de frappe/mauvaise valeur définie dans votre connexion variables.
Qui peut être vu dans cette sortie, vous avez collé:
Ce qui a probablement eu lieu pendant le réglage de la variable via
la bonne façon est de le définir sans les guillemets.
Vieille réponse (pour d'autres utilisateurs, qui peuvent, recherche pour des problèmes similaires)
La convention pour les chaînes de connexion est
SQLCONNSTR_
,MYSQLCONNSTR_
,SQLAZURECONNSTR_
etCUSTOMCONNSTR_
qui sont utilisés par Azure Web Apps, mais aussi de travail pour l'auto-hébergement, de machines ou de tout autre fournisseur de cloud.Donc si vous avez une variable d'environnement appelée
CUSTOMCONNSTR_TestDb
il sera le même que la définition qu'il en appsettings.json dansIl permettra également de remplacer la valeur à l'intérieur, si
AddEnvironmentVariables()
est appelée après.UseJsonFile(...)
. Dernier enregistrement wins.Vous pouvez également utiliser d'autres variables à remplacer les valeurs de configuration. iirc.
ASPNETCORE_
est le préfixe par défaut (mais vous pouvez le modifier dans laAddEnvironmentVariables("MY_")
).Donc un
ASPNETCORE_MySettings
remplaceConfiguration["MySettings"]
(ouConfiguration.Get("MySettings")
) etASPNETCORE_My__Settings
(utiliser trait de soulignement double pour le niveau de la hiérarchie sur Linux, lire, où:
est utilisé pour obtenir la config de Linux n'autorise pas les deux points dans les noms de variables) remplaceConfiguration["My:Settings"]
alors même queSauf s'ils ont changé que récemment.
FWIW: les variables d'Environnement/de la configuration des noms de clé sont insensibles à la casse autant que je me souvienne.
Il n'a pas à être défini dans
appsettings.json
, mais aide avec les tests d'avoir de développement de la chaîne de connexion il et de le remplacer par la variable d'Environnement, c'est à direCUSTOMCONNSTR_TestDb
)OK, j'ai essayé le réglage de l'environnement nom de la variable à CUSTOMCONNSTR_TestDb comme la variable et de la même chaîne de connexion que je l'utilise et je reçois toujours le message d'erreur répertorié au début de mon post original. Le message d'erreur contient la chaîne "du Système.ArgumentException: le mot-Clé non pris en charge: '"server".", ce qui me fait penser que ma réelle valeur de chaîne de connexion n'est pas correctement formaté pour une utilisation en tant que valeur d'une variable d'environnement.
OK, il semble que la variable d'Environnement ASPNETCORE_TestDb n'est pas examine par mon code. L'erreur que je recevais était le fait que j'avais "ConnectionStrings": { "TestDb": "espace Réservé pour la chaîne de connexion. Remplacée par les Secrets de l'Utilisateur dans le Développement et les Variables d'Environnement dans la Production. "} dans ma production appSettings.fichier json pour alerter quiconque regarde le fichier que la chaîne de connexion doit être à venir à partir de la variable d'Environnement.
Pas
ASPNETCORE_TestDb
, cela suppose que votre chaîne de connexion est dans le racine élément de la appsettings.json, mais c'est dans la chaîne de connexion, de sorte qu'il devrait êtreASPNETCORE_ConnectionStrings__TestDb
ouASPNETCORE_ConnectionStrings:TestDb
sur Windows, car il soutien:
dans les variables d'environnement. Dernière chose que j'ai trouvé ce changement annonce/ à ce sujet à modifierASPNETCORE_
, mais vous pouvez supprimer le préfixe si vous ne l'aimez pas, par.AddEnvironmentVariables("")
OriginalL'auteur Tseng
Dans votre configuration, vous avez cette ligne:
C'est de dire à votre configuration système qu'il pourrait y avoir un fichier JSON qui existe avec l'environnement de paramètres spécifiques. Si vous avez seulement besoin d'un fichier qui existe sur la boîte de production appelé
appSettings.Production.config
contenant quelque chose comme ceci:Les valeurs ici remplace toute spécifié dans la base JSON fichier de paramètres.
OriginalL'auteur DavidG
si vous ne voulez pas stocker dans appsettings, de le stocker dans le fichier
C:\Windows\System32\inetsrv\config\applicationHost.config. Il sera en mesure de travailler.
OriginalL'auteur mukesh joshi