Есть ли простой способ прочитать 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
как ссылки.