【问题标题】:Problems retrieving appsettings added during application start检索应用程序启动期间添加的应用程序设置时出现问题
【发布时间】:2010-12-07 14:53:38
【问题描述】:

我似乎遇到了一个奇怪的问题,在我的 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 类似的属性,当我在视图 (&lt;%= ApplicationFacade.Putz %&gt;) 中进行调用时,我会返回“mash”。

所以,我知道我的 ApplicationFacade 工作正常。所以也许这是我在 application_start() 中的代码?

好吧,如果我把这个放在我的视图中&lt;%=Application["WebServiceUsername"]%&gt;myUsername 就会被返回。

什么给了?!

回答

ConfigurationManager.AppSettings.Set(appConfig.ConfigName,appConfig.ConfigValue);

【问题讨论】:

    标签: c# asp.net appsettings facade


    【解决方案1】:

    Application_Start 中,当您引用Application 对象时,这实际上是HttpApplicationState 的一个实例,用于在内存中保存应用程序特定的设置,与存储在web.config 中的键/值appSettings 无关.

    • 当您使用WebConfigurationManager.AppSettings["someKey"] 时,这将返回与web.config 的appSettings 部分中的someKey 对应的值。
    • 当您使用Application["someKey"] 时,这将返回一个缓存在应用程序实例中的值。

    两者完全不相关,您不能指望用WebConfigurationManager.AppSettings["someKey"] 读取存储在Application["someKey"] 中的值。

    【讨论】:

    • 达林,谢谢你这么说。我现在觉得有点傻。但是,如何从 Web 项目外部访问 Application 对象?
    • 你不能。 Application 对象表示您的 Web 应用程序的实例,它可能位于 IIS 的某个应用程序池中,因此只能从应用程序本身内部访问它。 AFAIK 不同的 AppDomains/进程将无法读取/写入此对象。
    • 谢谢你纠正我的愚蠢!我已经用ConfigurationManager.AppSettings.Set(appConfig.ConfigName,appConfig.ConfigValue);修复了它
    • 我不会称之为愚蠢。您在使用某些框架类时遇到了困难,您通过给出具体示例完美地描述和阐述了您的问题,这些示例几乎在所有情况下都能快速解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    相关资源
    最近更新 更多