Есть ли простой способ прочитать appsettings файла web.config, просто используя его путь?

Это показалось мне легким, но я не могу найти правильный запрос Google, чтобы помочь мне..

У меня есть файл web.config, расположенный в C:\temp, и я хотел бы использовать что-то вроде myWebConfig.AppSettings["myParam"], Можно ли это сделать?

Я пытался с помощью ConfigurationManager.OpenMappedMachineConfiguration, ConfigurationManager.OpenExeConfiguration, WebConfigurationManager.OpenWebConfiguration а также WebConfigurationManager.OpenMappedWebConfiguration,

Может я просто не правильно их использую или..?

[Обновить]
То, что написал tvanfossen, так же хорошо, как и правильно. У меня нет прав на редактирование, поэтому я напишу код, который использовал в конце здесь.

/* Method based on what I found on http://stackru.com/questions/4339167/how-to-read-a-configuration-section-from-xml-in-a-database/4844365#4844365
 * and tvanvossens answer.
 * There's probably room for improvement, but it does what I need now.
 */
private static T GetSection<T>(string pathToWebConfigFile, string configNode) where T : ConfigurationSection, new()
{
    var doc = XDocument.Load(pathToWebConfigFile);
    var element = doc.Element("configuration").Element(configNode);
    var reader = element.CreateReader();
    var settingsSection = new T();
    settingsSection.GetType().GetMethod("DeserializeSection", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(settingsSection, new object[] { reader });
    return settingsSection;
}

пример использования:

var settingsSection = GetSection<AppSettingsSection>(pathToWebConfigFile, "appSettings");
var connectionStringSection = GetSection<ConnectionStringsSection>(pathToWebConfigFile, "connectionStrings");

4 ответа

Решение

Зависит от того, что вы подразумеваете под "легким". Я думаю, что это можно сделать с помощью отражения, но оно не будет особенно гибким.

Сначала вы откроете документ в формате XML и найдете appSettings раздел. Тогда вы создадите XmlReader для этого раздела. Затем создайте AppSettingsSection и вызовите метод DeserializeSection(), используя отражение с читателем в качестве аргумента. Вы можете использовать Reflector, чтобы увидеть, как ConfigurationManager делает это, так как могут быть другие методы в AppSettingsSection, которые необходимо вызвать для завершения загрузки раздела.

Полностью непроверенный пример...

 XDocument doc = XDocument.Load(@"c:\temp\web.config");
 var appSettingsElement = doc.Elements("appSettings").First();
 var reader = appSettingsElement.CreateReader();
 var settings = new AppSettingsSection();
 var method = typeof(AppSettingsSection).GetMethod("DeserializeSection",
                                                   BindingFlags.NonPublic,
                                                   null,
                                                   null,
                                                   new[] { typeof(XmlReader) },
                                                   null );
 method.Invoke( settings, new [] { reader } );

 var value = settings["myParam"];

Я вижу, что вы уже пробовали WebConfigurationManager.OpenWebConfiguration(...) - ты скучал config.AppSettings?

// Resolved from the application root with "~"
// "~/MySubfolder/With/SpecialConfig/" works; values are read hierarchically
var relativePath = "~/";

var config = WebConfigurationManager.OpenWebConfiguration(relativePath);

var myParam = config.AppSettings.Settings["myParam"].Value;

// You can use it to save settings too
config.AppSettings.Settings["myParam"].Value = "my new param value";

config.Save(ConfigurationSaveMode.Modified);

Итог: --- Нет. Раздел конфигурации appSettings является элементом xml и его содержимым в общей структуре конфигурации Hiearchical, которая может состоять из множества отдельных файлов. Какой файл (или файлы *), в котором находится раздел appSettings, определяется другими настройками в системе конфигурации. Таким образом, вы не можете получить доступ к настройкам, просто указав путь к файлу pr, вы должны использовать встроенные системные методы.Net-конфигурации.

  • на основе других настроек в системе конфигурации, раздел может быть помещен в другой файл, или индивидуальные настройки в разделе могут быть расположены в разных файлах, на разных уровнях системы конфигурации ()

Предполагая, что ваша переменная "YourVariable"

Ниже строки кода возвращает путь к файлу.

HttpContext.Current.Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["YourVariable"])

Чтобы получить доступ только к значению web.config, напишите этот путь.

System.Configuration.ConfigurationManager.AppSettings["YourVariable"]

В вашем проекте вы должны вставить System.configuration как ссылки.

Другие вопросы по тегам