【问题标题】:Is there a bug with this design?这个设计有问题吗?
【发布时间】:2014-11-11 16:13:24
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 它不是静态变量。它是每个 http 上下文的静态属性。上下文是每个请求。
    • @vcsjones 进行一些测试 - 上下文保持不变,不是每个请求 - 是一个静态属性,在静态字典上查找......只有当你有网络花园时,它才会保持不变,并且每次都取决于您要查找的池。
    • 好吧,其实我们都是对的。 HttpContext.Current 是每个请求的,但 Application 是跨请求共享的。在您进行修改之前,我无法撤消我的反对票。
    • 好的,通过上下文来获取一个静态对象来放置设置似乎很奇怪,但如果这不是问题,那么我可以暂时离开它(尽管这样做让我很恼火)。
    【解决方案2】:

    我一般不会碰Application_Start 中的 HttpContext。事实上,我认为 IIS 的集成管道甚至不会让您这样做。

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

    【讨论】:

      【解决方案3】:

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

      例如

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

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

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

      编辑:

      根据 cmets,听起来 session state 会在这里为您提供帮助。使用会话状态,您可以存储用户特定的设置,这样它们就不会干扰其他用户。

      【讨论】:

      • 感谢 Jason,但这些是用户可修改的设置。
      • 另外,这是我必须努力不重构太多代码的应用程序之一,因为我可以连续 6 周这样做,并且在我需要做的实际工作上取得零进展。所以我只是想弄清楚这是否真的会成为一个问题,然后再去尝试解决它:)
      • 我认为静态变量可能更合适。只有管​​理员(不是网络管理员,而是应用程序的管理员用户)可以更改设置(在应用程序内),并且当他们这样做时,每个人都会更改。
      猜你喜欢
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2012-06-03
      • 2012-10-24
      • 1970-01-01
      • 2011-01-17
      • 2015-11-28
      • 1970-01-01
      相关资源
      最近更新 更多