这个设计有漏洞吗?

时间:2014-11-11 16:13:25

标签: asp.net .net global-asax httpcontext

我正在完成由之前的开发人员启动的功能。我注意到他在Global.asax Application_Start方法中从db加载设置,并将设置放入HttpContext.Current.Application [" SettingName"]。

在开发中,这在我的机器上运行良好。如果我没有弄错,虽然这看起来像是在制作中,它会在第一个用户启动应用程序时加载一次数据,但任何后续用户的应用程序都无法使用设置。

有人可以确认或否认我的怀疑吗?

3 个答案:

答案 0 :(得分:2)

HttpContext.Current.Application["SettingName"]是一个静态属性。它也可供下一个后续用户使用。但你不能轻易改变它,特别是如果你使用网络花园。

您可以在此处阅读更多详细信息:Using static variables instead of Application state in ASP.NET

我不知道设计是怎样的,但你可以使用一个简单的静态字典来直接从数据库中读取你的参数,或者从web.config。

答案 1 :(得分:1)

我建议您将设置放在web.config文件中,然后使用ConfigurationManager对象来读取这些设置。这样更简单,因为不需要将它们存储在HttpContext中。

e.g。

<configuration>
    <appSettings>
      <add key="SettingName" value="SettingValue" />
    </appSettings> 
</configuration>

这样做意味着整个ASP.NET应用程序都可以使用这些设置 - 无需将它们存储在HttpContext中。

有一点需要注意,当您更新web.config文件时,ASP.NET站点的应用程序池将被回收。但这一切的后果都取决于该网站正在做什么,例如会话状态和缓存。重新安排应用程序池将重置那些,但这是另一个问题......

编辑:

根据评论,听起来session state会对您有所帮助。使用会话状态,您可以存储特定于用户的设置,以便它们不会干扰其他用户。

答案 2 :(得分:1)

我通常不会触及Application_Start中的HttpContext。事实上,我认为IIS的集成管道甚至不会让你这样做。

使用集成管道,Application_Start可能会在任何请求甚至命中服务器之前被触发,例如IIS 8的Application Initialization