Pregunta Archivos de configuración .NET configSource fuera de la carpeta del directorio de la aplicación


Tengo dos aplicaciones, una de consola y otra de ASP.NET. Ambos necesitan conocer la misma appSettings y connectionStrings. Entonces, idealmente, me gustaría usar la propiedad configSource de los archivos app.config / web.config para señalar eso a una ubicación central. Por ejemplo

<connectionStrings configSource="D:\connectionStrings.config"/>
<appSettings configSource="D:\appSettings.config"/>

Sin embargo, eso falla con un error:

El atributo configSource no es válido .: configSource 'D: \ appSettings.config' no es válido. Debe hacer referencia a un archivo en el mismo directorio o en un subdirectorio como el archivo de configuración.

¿Hay alguna forma de seguir utilizando los gestores de configuración appSettings / connectionStrings y obtener los valores de una ubicación externa?
Estoy contento de tener que agregar código para hacerlo, pero no quiero tener que reemplazar todo el sistema de administrador de configuración.


76
2018-02-20 10:54


origen


Respuestas:


Otra solución es simplemente agregar el archivo de configuración en todos sus proyectos como un enlace en lugar de copiar el archivo a sus proyectos. A continuación, establezca la "Acción de compilación" del archivo en "Contenido" y "Copiar en el directorio de salida" a "Copiar si es más nuevo" y cuando compile el proyecto tendrá el archivo en el directorio de salida.

Para agregar el archivo como un enlace en el cuadro de diálogo "Agregar elemento existente", hay un botón Agregar con un menú desplegable. Elija "Agregar como enlace" del menú desplegable en el botón Agregar para completar el proceso.


91
2018-03-28 22:56



En appSettings puedes usar file = en lugar de configSource =


29
2017-12-02 17:01



Parece que esa es la forma en que es. configSource debe estar en la misma carpeta o más profundo.

podría, aunque no estoy seguro de que debería, use un enlace físico NTFS. [sonrisa loca]


16
2018-02-20 11:03



Puede cargar la configuración desde una ubicación arbitraria, pero no estará disponible a través de las propiedades estáticas de ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Hay una sobrecarga que permite que se especifiquen archivos de varias entradas para admitir la jerarquía predeterminada / itinerancia del usuario / usuario-local).

La pérdida de las propiedades estáticas significa que todo el código debe conocer la configuración diferente.


8
2018-02-20 11:01



Visual Studio 2015

Si tiene este problema con Web.Config, la respuesta aceptada es correcta, pero solo para expandir, ya que esto me hizo darme la palma de la mano:

Cuando agrega un archivo .config a su proyecto usando 'Agregar como enlace' y luego establece la propiedad Copiar del enlace a 'Copiar si es nuevo' o 'Copiar siempre', entonces el archivo físico se copiará a la carpeta / bin.

Por lo tanto, cuando tiene una sección de configuración definida en Web.Config como esta:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

entonces debe definir el elemento de configuración relacionado de esta manera:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

de modo que configSource apunte al archivo bin físico \ MySpecialConfig.config no al enlace  Además, tenga en cuenta que el camino es una relativo camino físico

Esto puede parecer ridículamente obvio, pero si no lo ha hecho antes, el archivo físico aún no está en la carpeta \ bin, por lo que es posible que no haga clic de inmediato.


4
2017-07-16 07:25



Puede colocar ambas configuraciones en machine.config y luego están disponibles para todas sus aplicaciones en el servidor.


2
2018-02-20 11:01



La solución que encontré que mejor funcionó fue colocar los archivos de configuración "compartidos" en un archivo central y luego usar un evento de preconstrucción en Visual Studio para copiarlos en una carpeta relativa de cada proyecto que lo necesitaba.


2
2018-03-11 11:02



Tuve un gran problema con este tema, pero encontré una buena solución aquí: prueba de ejecución con configuración externa 

(Puede dirigir la ejecución de prueba para copiar archivos y directorios en el directorio de ejecución de prueba editando el archivo .testrunconfig).

Aunque por qué el proyecto de tipo de prueba de unidad puede obtener configuraciones de configuración desde su propia aplicación.config, pero no ser capaz de cargar los archivos de configuración referenciados como una aplicación normal.config es un poco desconcertante para mí. Lo llamaría un error porque esperaría que un proyecto de prueba app.config se comporte de la misma manera que se comporta la aplicación app.config, pero no es así.


2
2017-07-27 12:43



En el caso de las cadenas de conexión, sí es posible apuntar a un archivo compartido. Si el archivo compartido está en una red UNC, requiere privilegios administrativos en la máquina donde se alojará la aplicación.

Solución: en su web.config, use configSource para apuntar a un archivo de configuración local. Debido a las restricciones de .Net, debe estar al nivel del archivo de configuración raíz o por debajo del mismo. Simplemente apunto a un archivo en la carpeta de la aplicación en sí:

<connectionStrings configSource="ConnectionStrings.config" />

En una ubicación compartida a la que pueda acceder el usuario del grupo de aplicaciones, agregue el archivo de configuración que contiene las cadenas de conexión compartidas. Este archivo no debe contener ningún xml que no sea la sección de connectionStrings. El archivo compartido, ConnectionStrings.config, se ve así:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

Ahora el truco. Cree un enlace simbólico de Windows en su carpeta de aplicaciones apuntando al archivo de configuración compartido externo. Necesitará privilegios de administrador para hacer esto:

mklink ConnectionStrings.config \\someServer\someShare\someFolder\ConnectionStrings.config

Acabamos de burlar .Net. El sistema de configuración usará la configuración configSource para buscar cadenas de conexión en un archivo local llamado ConnectionStrings.config. El enlace simbólico se ve como un archivo en .Net, y el enlace simbólico se resuelve en el archivo de configuración compartido.

Advertencias: los cambios en el archivo compartido no desencadenan automáticamente el reinicio de una aplicación en .Net. En el caso de IIS, el sitio web o grupo de aplicaciones deberá reiniciarse manualmente.

Debido a la necesidad de privilegios administrativos para crear el enlace simbólico, este enfoque puede no funcionar para todos. Hay dos alternativas relacionadas que pueden funcionar si el archivo compartido está en la misma unidad lógica: enlaces duros y cruces. Ver esta discusión y esta discusión para más información.


2
2017-08-29 20:21