Estou desenvolvendo um componente de acesso a dados que será usado em um site que contém uma mistura de páginas clássicas de ASP e ASP.NET e precisa de uma boa maneira de gerenciar suas definições de configuração.
Eu gostaria de usar um costume ConfigurationSection
, e para as páginas ASP.NET isso funciona muito bem. Mas quando o componente é chamado via interoperabilidade COM a partir de uma página ASP clássica, o componente não está sendo executado no contexto de uma solicitação ASP.NET e, portanto, não tem conhecimento do web.config.
Existe uma maneira de dizer ConfigurationManager
para apenas carregar a configuração de um caminho arbitrário (por exemplo, ..\web.config
se meu assembly estiver na /bin
pasta)? Se houver, acho que meu componente pode voltar a isso se o padrão ConfigurationManager.GetSection
retornar null
para minha seção personalizada.
Quaisquer outras abordagens para isso serão bem-vindas!
fonte
Respostas:
Tente o seguinte:
fonte
var config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/web.config");
Outra solução é substituir o caminho do arquivo de configuração do ambiente padrão.
Acho que é a melhor solução para o carregamento de arquivos de configuração de caminho não trivial, especificamente a melhor maneira de anexar arquivos de configuração à dll.
Exemplo:
Mais detalhes podem ser encontrados neste blog .
Além disso, esta outra resposta possui uma excelente solução, completa com código para atualizar a configuração do aplicativo e um
IDisposable
objeto para redefini-la ao seu estado original. Com esta solução, você pode manter a configuração temporária do aplicativo no escopo:fonte
A resposta de Ishmaeel geralmente funciona, no entanto, encontrei um problema, que é o de que o uso
OpenMappedMachineConfiguration
parece perder seus grupos de seções herdados do machine.config. Isso significa que você pode acessar suas próprias seções personalizadas (que é todo o OP desejado), mas não as seções normais do sistema. Por exemplo, este código não funcionará:Basicamente, se você observar
configuration.SectionGroups
, verá que o system.net não está registrado como um SectionGroup, por isso é praticamente inacessível pelos canais normais.Encontrei duas maneiras de contornar isso. A primeira, da qual não gosto, é reimplementar os grupos de seções do sistema, copiando-os do machine.config para o seu próprio web.config, por exemplo
Não sei se o aplicativo da Web será executado corretamente depois disso, mas você pode acessar os sectionGroups corretamente.
A segunda solução é abrir o seu web.config como uma configuração EXE, que provavelmente está mais próxima da função pretendida:
Ouso dizer que nenhuma das respostas fornecidas aqui, nem a minha nem a de Ishmaeel, estão usando essas funções como os projetistas do .NET pretendiam. Mas, isso parece funcionar para mim.
fonte
Além da resposta de Ishmaeel, o método
OpenMappedMachineConfiguration()
sempre retornará umConfiguration
objeto. Portanto, para verificar se ele carregou, verifique aHasFile
propriedade onde true significa que veio de um arquivo.fonte
A resposta aceita está errada !!
Ele lança a seguinte exceção ao acessar a propriedade AppSettings:
Aqui está a solução correta:
fonte
Forneci os valores de configuração à palavra hospedada .nET Compoent da seguinte maneira.
Um componente da .NET Class Library sendo chamado / hospedado no MS Word. Para fornecer valores de configuração ao meu componente, criei winword.exe.config na pasta C: \ Arquivos de Programas \ Microsoft Office \ OFFICE11. Você deve conseguir ler os valores das configurações como faz no .NET tradicional.
fonte
Para o ASP.NET, use o WebConfigurationManager:
fonte
Use o processamento XML:
fonte
Isso deve fazer o truque:
Fonte: https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files
fonte