asp.net - example - configurationmanager.connectionstrings c#
Uso de ConfigurationManager para cargar la configuraciĆ³n desde una ubicaciĆ³n arbitraria (9)
Además de la respuesta de Ishmaeel, el método
OpenMappedMachineConfiguration()
siempre devolverá un objeto de
Configuration
.
Entonces, para verificar si se cargó, debe verificar la propiedad
HasFile
donde true significa que proviene de un archivo.
Estoy desarrollando un componente de acceso a datos que se utilizará en un sitio web que contiene una combinación de páginas clásicas de ASP y ASP.NET, y necesito una buena manera de administrar sus ajustes de configuración.
Me gustaría usar una sección de
ConfigurationSection
personalizada, y para las páginas ASP.NET esto funciona muy bien.
Pero cuando el componente se llama a través de la interoperabilidad COM desde una página ASP clásica, el componente no se ejecuta en el contexto de una solicitud ASP.NET y, por lo tanto, no tiene conocimiento de web.config.
¿Hay alguna manera de decirle a
ConfigurationManager
que simplemente cargue la configuración desde una ruta arbitraria (por ejemplo,
../web.config
si mi ensamblaje está en la carpeta
/bin
)?
Si hay, entonces estoy pensando que mi componente puede recurrir a eso si el
ConfigurationManager.GetSection
predeterminado devuelve un
null
para mi sección personalizada.
¡Cualquier otro enfoque a esto sería bienvenido!
Esto debería funcionar :
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);
Fuente: https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files
La respuesta de Ishmaeel generalmente funciona, sin embargo, encontré un problema: el uso de
OpenMappedMachineConfiguration
parece perder los grupos de sección heredados de machine.config.
Esto significa que puede acceder a sus propias secciones personalizadas (que es todo lo que desea el OP), pero no a las secciones normales del sistema.
Por ejemplo, este código no funcionará:
ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns null
Básicamente, si vigila la
configuration.SectionGroups
. Grupos de Sección, verá que system.net no está registrado como un Grupo de Sección, por lo que es prácticamente inaccesible a través de los canales normales.
Hay dos maneras en que he encontrado para solucionar esto. El primero, que no me gusta, es volver a implementar los grupos de la sección del sistema copiándolos desde machine.config en su propio web.config, por ejemplo
<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</sectionGroup>
</sectionGroup>
No estoy seguro de que la aplicación web se ejecute correctamente después de eso, pero puede acceder a la sección Grupos correctamente.
La segunda solución es abrir su web.config como una configuración EXE, que probablemente esté más cerca de su función prevista de todos modos:
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup; // returns valid object!
No me atrevo a decir que ninguna de las respuestas proporcionadas aquí, ni las mías ni las de Ishmaeel, están usando estas funciones como pretendían los diseñadores. Pero, esto parece funcionar para mí.
Otra solución es anular la ruta del archivo de configuración del entorno predeterminado.
Creo que es la mejor solución para la carga de archivos de configuración de rutas no triviales, específicamente la mejor manera de adjuntar el archivo de configuración a dll.
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);
Ejemplo:
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:/Shared/app.config");
Más detalles se pueden encontrar en este blog .
Además,
esta otra respuesta
tiene una excelente solución, completa con un código para actualizar la configuración de la aplicación y un objeto
IDisposable
para restablecerla a su estado original.
Con esta solución, puede mantener la configuración de la aplicación temporal en el ámbito:
using(AppConfig.Change(tempFileName))
{
// tempFileName is used for the app config during this context
}
Para ASP.NET use WebConfigurationManager:
var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
Proporcioné los valores de configuración para Word alojado .nET Compoent de la siguiente manera.
Un componente de .NET Class Library que se llama / aloja en MS Word. Para proporcionar valores de configuración a mi componente, creé winword.exe.config en la carpeta C: / Archivos de programa / Microsoft Office / OFFICE11. Debería poder leer los valores de las configuraciones como lo hace en Traditional .NET.
string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
Prueba esto:
System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
Utilizar procesamiento XML:
var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);
// can call root.Elements(...)
¡La respuesta aceptada es incorrecta!
Lanza la siguiente excepción al acceder a la propiedad AppSettings:
No se puede convertir el objeto de tipo ''System.Configuration.DefaultSection'' para escribir ''System.Configuration.AppSettingsSection''.
Aquí está la solución correcta:
System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);