【问题标题】:Getting ApplicationState in asp.net without HttpContext在没有 HttpContext 的情况下在 asp.net 中获取 ApplicationState
【发布时间】:2009-03-23 10:02:18
【问题描述】:

我有一个 webapp,它在 ApplicationState 中存储了一个配置对象。 此对象包含与数据库的连接字符串等。

有时我会启动一个异步线程来执行一些运行时间较长的任务,例如发送电子邮件和更新数据库。

但是,由于该线程没有 HttpContext,我无法获取配置对象。

我知道这种一切都依赖于 HttpContext 的设计很糟糕,但现在改变已经太迟了。 查看反射器,我看到 HttpContext 类仅使用静态内部类来获取 ApplicationState。有没有其他方法可以解决?

.net 中的所有内部类真的很烦人。

【问题讨论】:

    标签: asp.net multithreading httpcontext httpapplication


    【解决方案1】:

    当你启动它时,只需将你喜欢的任何东西传递给你的线程。使用ParameterizedThreadStart 委托来启动它,而不仅仅是ThreadStart 委托。您可以将 HttpContext.Current 传递给它,或者将您希望线程拥有的信息捆绑在一起,然后传递它。

    【讨论】:

      【解决方案2】:

      如果您真的需要从异步处理程序访问应用程序状态(或类似),您应该修改您的 HttpApplication 子类(例如 Global.asax)以存储应用程序状态实例 (this.Application) Application_Start 期间的静态属性:

      public static HttpApplicationStateWrapper State { get; private set; }
      
      protected void Application_Start()
      {
          State = new HttpApplicationStateWrapper(this.Application);
      }
      

      使用 DI 框架来注册这个实例会更合适,但如果你有一个可用的框架,你可能完全可以避免使用 Application State 来存储配置。此外,.NET 中有一个配置框架可以直接满足这一需求并提供从任何地方读取配置的能力。

      【讨论】:

        猜你喜欢
        • 2011-01-25
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-07
        • 2013-05-19
        • 2013-10-10
        相关资源
        最近更新 更多