Accessing Config File From Web - No AppSettings

2019-08-27 18:15发布

问题:

I am working on a project that requires me to modify the .config file for a Windows service (written in ASP.NET) I wrote. The changes need to be made from an administrative website I am developing. When the user selects the 'UPDATE' button on the web app, the code below is executed:

Protected Sub ModifyAppConfig()
        Try
            Dim configFile = "C:\App\App.exe.config"
            Dim configFileMap As New ExeConfigurationFileMap
            configFileMap.ExeConfigFilename = configFile
            Dim config As System.Configuration.Configuration
            config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None)
            config.AppSettings.Settings("LogDirectory").Value = txtLogDirectory.Text '* EXCEPTION IS THROWN HERE *
            config.Save()
        Catch ex As Exception

        End Try
    End Sub

When the application is trying to access "LogDirectory" AppSettings index, an exception is thrown. Object reference not set to an instance of an object. During debugging, the AppSettings.Count = 0. How come none of the AppSettings are imported?

I know that it is correctly opening the file because there are ConnectionString data. Below is the config File:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <connectionStrings>
      <add name="conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;Integrated Security=True" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
    </startup>
    <appSettings>
      <add key="LogDirectory" value="C:\CTemp\"/>
    </appSettings>
</configuration>

How can I access and modify the AppSettings("LogDirectory") value?

回答1:

Frankly, I don't see anything wrong with your program.

I've created a VB.Net/Console mode MCVE that might help your troubleshooting

Module1.vb

Imports System.Configuration

'
' EXAMPLE OUTPUT:
'   Reading config file(test.exe.config)...
'   config.AppSettings.Settings("LogDirectory") : C : \CTemp\
'   connectionStrings: <connectionStrings>
'   <add name = "conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;
'   Integrated Security=True" providerName="System.Data.SqlClient"/>
'     </connectionStrings>
'   appSettings: <appSettings>
'   <add key = "LogDirectory" value="C:\CTemp\"/>
'     </appSettings>
'   startup: <startup>
'   <supportedRuntime version = "v4.0" sku=".NETFramework,Version=v4.5"/>
'     </startup>
'   3 sections were found.
'
Module Module1

    Sub Main()
        ' Get filename
        Dim args() As String = System.Environment.GetCommandLineArgs()
        If args.Length <> 2 Then
            Console.WriteLine("USAGE: ReadAppConfig <\path\to\app.config>")
            Return
        End If
        Dim configFilePath As String = args(1)

        ' Open config file
        Try
            Console.WriteLine("Reading config file(" & configFilePath & ")...")
            Dim configFileMap As New ExeConfigurationFileMap
            configFileMap.ExeConfigFilename = configFilePath
            Dim config As System.Configuration.Configuration
            config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None)

            ' Try to read AppSettings["LogDirectory"]
            Dim obj = config.AppSettings.Settings("LogDirectory")
            If IsNothing(obj) Then
                Console.WriteLine("config.AppSettings.Settings(""LogDirectory""): NULL")
            Else
                Console.WriteLine("config.AppSettings.Settings(""LogDirectory""): " & obj.Value)
            End If

            ' Dump all Sections
            Dim ct As Integer = 0
            For Each section As ConfigurationSection In config.Sections
                Dim xml = section.SectionInformation.GetRawXml
                If Not xml = Nothing Then
                    Console.WriteLine(section.SectionInformation.Name & ": " & xml)
                    ct = ct + 1
                End If
            Next
            Console.WriteLine(ct & " sections were found.")
        Catch ex As Exception
            System.Console.WriteLine("ERROR:   " & ex.Message)
        End Try

    End Sub

End Module

test.exe.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="conn" connectionString="Data Source=DBASE;Initial Catalog=NGDevl;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
    <add key="LogDirectory" value="C:\CTemp\"/>
  </appSettings>
</configuration>
  • Project > test.exe.config: I set the "Copy to Output" property to "Copy if Newer"

  • Project > Properties > Debug: I set "Command line arguments" to "test.exe.config"

'Hope that helps...