Usando ConfigurationManager para carregar a configuração de um local arbitrário

votos
111

Estou desenvolvendo um componente de acesso de dados que será usado em um site que contém uma mistura de clássicos páginas ASP e ASP.NET, e precisam de uma boa maneira de gerenciar suas configurações.

Eu gostaria de usar um personalizado ConfigurationSection, e para as páginas ASP.NET isso funciona muito bem. Mas quando o componente é chamado através de interoperabilidade COM a partir de uma página ASP clássico, o componente não está em execução no contexto de um pedido ASP.NET e, portanto, não tem conhecimento de web.config.

Existe uma maneira de dizer a ConfigurationManagerapenas carregar a configuração de um caminho arbitrário (por exemplo, ..\web.configse a minha montagem está na /binpasta)? Se houver, então eu estou pensando meu componente pode cair de volta para que se o padrão ConfigurationManager.GetSectionretorna nullpara a minha seção personalizada.

Quaisquer outras abordagens para isso seria bem-vinda!

Publicado 07/08/2008 em 15:07
fonte usuário
Em outras línguas...                            


8 respostas

votos
108

Tente isto:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
Respondeu 07/08/2008 em 15:14
fonte usuário

votos
64

Outra solução é substituir o ambiente padrão caminho do arquivo de configuração.

Acho que é a melhor solução para a de não-trivial-caminho de carga arquivo de configuração, especificamente a melhor maneira de anexar arquivo de configuração para DLL.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

Exemplo:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

Mais detalhes podem ser encontrados no neste blog .

Além disso, esta outra resposta tem uma excelente solução completa, com código para atualizar a configuração do aplicativo e um IDisposableobjeto para redefini-la de volta ao seu estado original. Com esta solução, você pode manter a configuração do aplicativo temporário escopo:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}
Respondeu 09/01/2013 em 21:52
fonte usuário

votos
38

A resposta de Ishmaeel geralmente funciona, no entanto eu encontrei um problema, o que é que o uso OpenMappedMachineConfigurationparece perder seus grupos de seções herdados de machine.config. Isso significa que você pode acessar suas próprias seções personalizadas (que é tudo o OP queria), mas não as seções normais do sistema. Por exemplo, este código não vai funcionar:

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

Basicamente, se você colocar um relógio no configuration.SectionGroups, você verá que system.net não está registrado como um sectionGroup, por isso é praticamente inacessível através dos canais normais.

Há duas maneiras que eu encontrei para contornar esse problema. A primeira, que eu não gosto, é a re-implementar os grupos de seções sistema copiando-as machine.config em seu próprio web.config eg

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

Eu não tenho certeza a aplicação web em si será executado corretamente depois disso, mas você pode acessar os sectionGroups corretamente.

A segunda solução é, em vez de abrir o seu web.config como uma configuração EXE, que é provavelmente mais perto de sua função pretendida de qualquer maneira:

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!

Eu ouso dizer que nenhuma das respostas fornecidas aqui, nem minha ou Ishmaeel de, são bastante usando estas funções como os designers .NET pretendidos. Mas, isso parece funcionar para mim.

Respondeu 29/09/2010 em 03:52
fonte usuário

votos
9

Além de resposta de Ishmaeel, o método OpenMappedMachineConfiguration()sempre retornará um Configurationobjeto. Então, para verificar para ver se ele carregado você deve verificar a HasFilepropriedade onde a verdadeira significa que ele veio de um arquivo.

Respondeu 08/08/2008 em 15:04
fonte usuário

votos
4

I desde que os valores de configuração a palavra hospedado .NET compoent como segue.

Um componente Biblioteca de classes .NET sendo chamado / hospedado no MS Word. Para fornecer valores de configuração para o meu componente, criei winword.exe.config na pasta C: \ Program Files \ Microsoft Office \ OFFICE11. Você deve ser capaz de ler os valores de configurações como você fazer em .NET tradicional.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];
Respondeu 11/11/2010 em 19:38
fonte usuário

votos
1

Usar o processamento XML:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)
Respondeu 08/02/2016 em 22:18
fonte usuário

votos
1

Para uso ASP.NET WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;
Respondeu 14/07/2014 em 21:43
fonte usuário

votos
0

Isso deve fazer o truque:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);

Fonte: https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

Respondeu 09/08/2018 em 10:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more