net launchsettings dotnet development asp c# asp.net-core environment-variables asp.net-core-mvc

c# - launchsettings - Cómo almacenar correctamente las cadenas de conexión en las variables de entorno para su recuperación por parte de las aplicaciones ASP.Net Core MVC de producción



environment include development (3)

En tu configuración tienes esta línea:

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

Esto le indica a su sistema de configuración que podría haber un archivo JSON que exista con la configuración específica del entorno. Por lo tanto, solo necesita un archivo que exista en el cuadro de producción llamado appSettings.Production.config contenga algo como esto:

{ "ConnectionStrings": { "TestDb": "Server=...;Catalog=...;Etc=..." } }

Los valores aquí anularán todo lo especificado en el archivo de configuración JSON base.

Estoy trabajando en una aplicación ASP.NET Core MVC y tengo un problema con mis cadenas de conexión.

Tengo una variable ASPNETCORE_ENVIRONMENT establecida en Production en mi servidor de producción y mi servidor de producción es un Windows Server 2012R2 que ejecuta IIS. También tengo el DotNetCore.1.0.4_1.1.1-WindowsHosting.exe instalado en el servidor de producción.

Durante el desarrollo, estoy usando UserSecrets para mantener mi cadena de conexión. Esto está funcionando correctamente.

Para la producción, quiero mis cadenas de conexión en las variables de entorno en mi servidor de producción y aquí es donde tengo un problema. Sospecho que puede estar en la forma en que estoy estructurando la variable de entorno.

Cuando intento acceder a la base de datos en producción, aparece un error que indica básicamente que no se puede analizar la cadena de conexión.

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 pongo la cadena de conexión en appSettings.json , el servidor de producción funciona bien.

Por lo tanto, aquí hay un ejemplo de mi archivo appSettings.json que muestra la cadena de conexión que funciona en producción;

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

Si implemento este archivo appSettings.json en producción, funciona bien.

En mi aplicación ASP.Net Core, en el archivo Startup.cs, tengo lo siguiente;

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(); }

Mi entendimiento es que el último builder.add ... listado tiene prioridad, por lo que en mi caso, si existe una cadena de conexión en el entorno, debería tener prioridad sobre cualquier cosa en los ajustes de configuración.

Entonces, en producción, si uso el siguiente archivo appSettings.config;

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

No debería importar lo que tengo como valor para ConnectionStrings:TestDb en ese archivo appsettings.json si tengo una variable de entorno para la cadena de conexión.

A continuación se muestra la variable de entorno que estoy usando;

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

Sin embargo, cuando uso esta configuración, recibo un error cuando intento acceder a la base de datos que indica que no se puede analizar la cadena de conexión.

Debo asumir que el problema es la forma en que tengo la cadena de conexión especificada en la variable de entorno, pero después de un tiempo de búsqueda en línea, no he podido encontrar un ejemplo de cómo debería ser exactamente el valor de la variable de entorno. Por ejemplo, ¿necesito colocar comillas al principio y al final alrededor de toda la cadena? ¿Las secciones individuales de la cadena de conexión necesitan comillas simples o dobles?

Cualquier ayuda, como un ejemplo de una cadena de conexión adecuada definida en una variable de entorno, sería muy apreciada.


Hay un valor de error tipográfico / incorrecto establecido en sus variables de conexión.

Lo que se puede ver en esta salida que pegaste:

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

Esto probablemente sucedió al configurar la variable a través de

$env:ConnectionStrings:MyDb = """Server=..."""

la forma correcta es configurarlo sin las comillas.

$env:ConnectionStrings:MyDb = "Server=..."

Respuesta antigua (para otros usuarios que pueden buscar problemas similares)

La convención para las cadenas de conexión es SQLCONNSTR_ , MYSQLCONNSTR_ , SQLAZURECONNSTR_ y CUSTOMCONNSTR_ que son utilizadas por Azure Web Apps, pero también deberían funcionar para el hospedaje automático, máquinas virtuales o cualquier otro proveedor de nube.

Entonces, si tiene una variable de entorno llamada CUSTOMCONNSTR_TestDb , será lo mismo que definirla en appsettings.json en

{ "connectionStrings": { "TestDb": "..." } }

También anulará el valor dentro de él, si se llama a AddEnvironmentVariables() después de .UseJsonFile(...) . La última inscripción gana.

var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) // This one needs to be last .AddEnvironmentVariables();

También puede usar otras variables para anular los valores de configuración. iirc ASPNETCORE_ es el prefijo predeterminado (pero puede cambiarlo en AddEnvironmentVariables("MY_") ).

Por lo tanto, ASPNETCORE_MySettings anula la Configuration["MySettings"] (o Configuration.Get("MySettings") ) y ASPNETCORE_My__Settings (use doble guión bajo para la jerarquía de niveles en Linux, lea dónde : se usa para obtener la configuración: Linux no permite el colon en nombres de variables) anula la Configuration["My:Settings"] misma manera que

{ "my": { "settings": "..." } }

A menos que hayan cambiado eso recientemente.

FWIW: Las variables de entorno / los nombres de las claves de configuración no distinguen entre mayúsculas y minúsculas, por lo que recuerdo.


Si no desea almacenar en la configuración de la aplicación, guárdelo en el archivo C: / Windows / System32 / inetsrv / config / applicationHost.config. Será capaz de trabajar.