使用WebConfigurationManager从Web.config文件中读取appSettings部分

时间:2018-08-30 09:02:51

标签: c# appsettings configurationmanager webconfigurationmanager

我正在使用C#和.NET Framework 4.7开发WinForm应用程序。

我想打开一个Web.config文件,阅读其appSetting部分并进行修改。

要打开它,我用这个:

 System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration(null);

它会打开它,但是,当我尝试通过以下方式获取密钥时:

string[] keys = config.AppSettings.Settings.AllKeys;

我得到一个空数组。

这是appSetting部分:

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <connectionStrings>

  </connectionStrings>
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

    <add key="MinRemainingCodes" value="100" />
    <!-- Others keys -->
  </appSettings>

</configuration>

也许问题在于它不是打开文件,而是在documentation中说:

  

配置文件的虚拟路径。如果为null,则根   Web.config文件已打开。

也许我不明白root的含义,因为该程序和Web.config文件位于同一文件夹中。

我在做什么错了?

3 个答案:

答案 0 :(得分:2)

WebConfigurationManager.OpenWebConfiguration包含对path参数的以下描述:

  

配置文件的虚拟路径。如果为null,则打开根Web.config文件。

由于您的应用程序未在IIS下作为网站运行,因此打开的Web.config实际上就是.NET Framework安装文件夹本身中的内容(在我的情况下为C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config )。

WebConfigurationManager.OpenMappedWebConfiguration允许您将虚拟目录映射到物理目录,以便允许您指定映射到您自己的本地目录的虚拟路径。这是我用来完成这项工作的代码:

var webConfigurationFileMap = new WebConfigurationFileMap();

webConfigurationFileMap.VirtualDirectories.Add(
    string.Empty,
    new VirtualDirectoryMapping(Directory.GetCurrentDirectory(), isAppRoot: true));

var webConfig = WebConfigurationManager.OpenMappedWebConfiguration(
    webConfigurationFileMap,
    string.Empty);

如您所见,我正在将根虚拟目录(使用string.Empty映射到应用程序的目录(使用Directory.GetCurrentDirectory)。

答案 1 :(得分:0)

如果我没记错的话,OpenWebConfiguration应该会接收到您的Web配置的路径,而您将其传递给null

尝试这样:

config = WebConfigurationManager.OpenWebConfiguration("~");

这也可以帮助您:How do you modify the web.config appSettings at runtime?

答案 2 :(得分:0)

首先,您将web.config用于桌面应用程序。听起来不正确。尝试改用app.config。 其次,WebConfigurationManager.OpenWebConfiguration打开Web应用程序配置文件

关于主题,要从配置文件中获取信息,请尝试使用

var keys = ConfigurationManager.AppSettings.AllKeys