我似乎有一个奇怪的问题,在我的Application.Start()中的global.asax中,我有一些内容到我的数据库,从名称/值表获取我的所有应用程序设置,然后删除他们通过Application.Add(name,value)
进入申请。
我在另一个项目中有一个'应用程序外观',我的服务层,数据层等使用它来获取我需要做的各种各样的设置。
在我的数据库中,我有几个条目:
ConfigName | ConfigValue
WebServiceUsername | myUsername
WebServicePassword | myPassword
所以在我的方法中,我离开并从数据库中获取这些值,并将它们放入我的应用程序中:
protected void GetApplicationSettings()
{
//Get all the config values out of the database, and then put them into the application keys...
var appConfigAttributes = ApplicationConfigurationService.GetAppConfigNames();
foreach (var appConfig in appConfigAttributes)
{
Application.Add(appConfig.ConfigName,appConfig.ConfigValue);
}
}
这是我稍后从应用程序调用值的方式:
public static string WebServiceUsername
{
get { return WebConfigurationManager.AppSettings["WebServiceUsername"]; }
}
这就是事情变得奇怪的地方。
如果我用我的web层调用应用程序外观:
<%= ApplicationFacade.WebServiceUsername %>
我什么也得不回来(是的,我在get方法中只试过了ConfigurationManager!)。
但这是奇怪的事情......
如果我手动将应用程序密钥放入我的web.config文件中......
<appSettings>
<add key="putz" value="mash"/>
</appSettings>
然后在我的ApplicationFacade类中使用Putz构建一个类似的属性,当我在视图(<%= ApplicationFacade.Putz %>
)中进行调用时,我得到'mash
'返回。
所以,我知道我的ApplicationFacade工作正常。也许这是我在application_start()中的代码?
好吧,如果我把它放在我的视图中<%=Application["WebServiceUsername"]%>
,则会返回myUsername
。
是什么给了什么?!
答案
ConfigurationManager.AppSettings.Set(appConfig.ConfigName,appConfig.ConfigValue);
答案 0 :(得分:3)
在Application_Start
引用Application
对象时,这实际上是HttpApplicationState的一个实例,用于在内存中保存应用程序特定设置,与键/值无关appSettings存储在web.config中。
WebConfigurationManager.AppSettings["someKey"]
时,这将返回与web.config的someKey
部分中的appSettings
对应的值。Application["someKey"]
时,将返回应用程序实例中缓存的值。两者完全无关,您不能指望使用Application["someKey"]
读取存储在WebConfigurationManager.AppSettings["someKey"]
中的值。