2016-09-26 11 views
0

Я пытаюсь загрузить пользовательский раздел с помощью стандартного XmlSerializer из текущего файла конфигурации приложения/webapp.Как загрузить текущий файл web.config/app.config как XML

Ниже решение не работает для веб-приложений:

var configFilePath = 
    ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 
    .FilePath; 

if (configFilePath == null || !File.Exists(configFilePath)) 
    return null; 

var xdoc = XDocument.Load(configFilePath); 

var section = 
    xdoc.Root?.Element("ParentSection")?.Element("MySection"); 

if (section == null) 
    return null; 

var serializer = new XmlSerializer(typeof(MyConfigType)); 

MyConfigType config; 

using (var reader = new StringReader(section.ToString())) 
{ 
    config = serializer.Deserialize(reader) as MyConfigType; 
} 

Как это можно легко сделать без проверки, если текущее приложение веб-приложение или нет?

(без использования System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration?)

ответ

0

Конфигурационный файл путь может быть решена следующим образом:

var configFilePath = 
    AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; 

Ответ основан на Sean «с удаленных ответ https://stackoverflow.com/a/27038942/38368 на другой вопрос

0

Другой подход с использованием Reflection (untested):

// Initialize ConfigurationManager 
var dummy = ConfigurationManager.AppSettings; 

object configSystem = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null); 
object configHost = configSystem.GetType().GetField("_configHost", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configSystem); 
object configPaths = configHost.GetType().GetProperty("ConfigPaths", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configHost); 
string path = (string)configPaths.GetType().GetProperty("ApplicationConfigUri", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(configPaths);