existe example contexto connectionstrings configurationsettings app actual asp.net configuration asp-classic

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!



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