有没有人在网络应用程序中得到这个工作?
无论我做什么,似乎我的 appSettings 部分(使用 appSettings file=".\Site\site.config" 从 web.config 重定向)都不会重新加载。
我注定要重新启动应用程序吗?我希望这种方法能引导我找到更高效的解决方案。
更新:
通过“重新加载”,我的意思是刷新 ConfigurationManager.AppSettings 而不必完全重新启动我的 ASP.NET 应用程序并且不必招致通常的启动延迟。
有没有人在网络应用程序中得到这个工作?
无论我做什么,似乎我的 appSettings 部分(使用 appSettings file=".\Site\site.config" 从 web.config 重定向)都不会重新加载。
我注定要重新启动应用程序吗?我希望这种方法能引导我找到更高效的解决方案。
更新:
通过“重新加载”,我的意思是刷新 ConfigurationManager.AppSettings 而不必完全重新启动我的 ASP.NET 应用程序并且不必招致通常的启动延迟。
确保将正确的区分大小写的值传递给 RefreshSection,即
ConfigurationManager.RefreshSection("appSettings");
当为您的 appSettings 使用外部配置文件时,这似乎是一个缺陷(可能是一个错误)。我已经尝试使用 configSource 属性,而 RefreshSection 根本不起作用,我假设在使用 file 属性时这是相同的。如果您将 appSettings 移回 web.config RefreshSection 将完美运行,否则恐怕您注定要失败。
由于某种原因ConfigurationManager.RefreshSection("appSettings")
对我不起作用。将 Web.Config 重新加载到 Configuration 对象中似乎可以正常工作。以下代码假定 Web.Config 文件是执行 (bin) 文件夹下的一个目录。
ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
Uri uriAssemblyFolder = new Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase));
string appPath = uriAssemblyFolder.LocalPath;
configMap.ExeConfigFilename = appPath + @"\..\" + "Web.config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
并且像这样使用:
string webConfigVariable = config.AppSettings.Settings["webConfigVariable"].Value;
当 appSettings 为外部时,.RefreshSection() 不起作用。
但是,您可以使用以下内容更改值:
ConfigurationManager.AppSettings.Set(key, value)
这不会更改文件上的设置,只会更改内存中加载的值。
因此,我没有使用 RefreshSection,而是执行了以下操作:
string configFile="path to your config file";
XmlDocument xml = new XmlDocument();
xml.Load(configFile);
foreach (XmlNode node in xml.SelectNodes("/appSettings/add"))
{
string key = node.Attributes["key"].Value;
string value= node.Attributes["value"].Value;
ConfigurationManager.AppSettings.Set(key, value);
}
对 AppSettings.Get 的任何后续调用都将包含更新后的值。
然后 appSettings 将被更新,而无需重新启动应用程序。
作为替代方案,您可以编写自己的ConfigSection
并设置restartOnExternalChanges="false"
.
然后,在阅读带有ConfigurationManager.GetSection("yourSection")
设置的部分时,将自动刷新而无需重新启动应用程序。
您可以将您的设置实现为强类型或 NameValueCollection。
是的。你被 iis 重新启动卡住了。
asp.net 4.0 和 iis 7.5 有一个功能,其中删除了初始启动。
我不确定这在网络应用程序中是否可行,但它适用于桌面应用程序。尝试使用 ConfigurationSettings 而不是 ConfigurationManager(它会因为使用过时的类而对你大喊大叫……),然后将所有数据读入一个类。当您希望刷新时,只需创建一个新实例并删除对旧实例的所有引用。我为什么这样做的理论(可能是错误的):当您在整个运行过程中不直接访问 app.config 文件时,应用程序会删除文件锁定。然后,可以在您不访问文件时进行编辑。
App.Config 设置在应用程序启动时缓存在内存中。出于这个原因,我认为您将无法在不重新启动应用程序的情况下更改这些设置。一种非常简单的替代方法是创建一个单独的简单 XML 配置文件,并自己处理加载/缓存/重新加载。
要写,这样称呼它:
昏暗配置为 System.Configuration.Configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~")
返回 AddOrUpdateAppSetting(config, "YourSettingKey", "YourValueForTheKey")
要读取并确保获得文件中的值,而不是缓存中的值,请以这种方式读取:
Dim config As System.Configuration.Configuration = WebConfigurationManager.OpenWebConfiguration("~")
Return config.AppSettings.Settings("TheKeyYouWantTheValue").Value
完整示例:
Protected Shared Function AddOrUpdateAppSetting( _
ByVal Config As System.Configuration.Configuration _
, ByVal TheKey As String _
, ByVal TheValue As String _
) As Boolean</p>
Dim retval As Boolean = True
Dim Itm As System.Configuration.KeyValueConfigurationElement = _
Config.AppSettings.Settings.Item(TheKey)
If Itm Is Nothing Then
If Config.AppSettings.Settings.IsReadOnly Then
retval = False
Else
Config.AppSettings.Settings.Add(TheKey, TheValue)
End If
Else
' config.AppSettings.Settings(thekey).Value = thevalue
If Itm.IsReadOnly Then
retval = False
Else
Itm.Value = TheValue
End If
End If
If retval Then
Try
Config.Save(ConfigurationSaveMode.Modified)
Catch ex As Exception
retval = False
End Try
End If
Return retval
End Function
您是否尝试将 AppSettings 存储在其自己的外部文件中?
从 app.config/web.config:
<appSettings configSource="appSettings.config"></appSettings>
appSettings.config:
<?xml version="1.0"?>
<appSettings>
<add key="SomeKey" value="SomeValue" />
</appSettings>
对 appSettings.config 所做的更改应立即反映。更多信息:http: //msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx