【问题标题】:Share object instance between web service invocations在 Web 服务调用之间共享对象实例
【发布时间】:2010-02-23 23:47:36
【问题描述】:

我有一个初始化成本相对较高的对象,它提供了处理 Web 服务请求所需的线程安全计算方法。

我正在寻找在请求之间保持初始化实例可用的最佳方法。

一种方法是将其声明为静态变量。然后它将一直可用,直到 AppDomain 被回收。

这是一个较旧的 Web 服务,不使用 WCF,但如果可以提供更好的解决方案,则可以选择转换。

有更好的方法吗?

【问题讨论】:

    标签: .net web-services asmx


    【解决方案1】:

    缓存HttpRuntime.Cache中的对象怎么样?

    MyObject val = (MyObject)HttpRuntime.Cache["MyCacheKey"];
    if (val == null)
    {
        val = // create your expensive object here
        HttpRuntime.Cache.Insert("MyCacheKey", val, null, 
          DateTime.Now.AddSeconds(3600), 
          System.Web.Caching.Cache.NoSlidingExpiration);
    }
    

    我将它在缓存中最多保留一个小时,但您可以根据需要进行更改。

    【讨论】:

    • 缓存的生命周期是否独立于每个 AppDomain 的生命周期(AppDomain 处理 HTTP 请求)?
    • @Eric J。它独立于单个 HTTP 请求。换句话说,您的服务可以处理 1000 次请求,并且对象将保留在缓存中。如果应用程序域回收(每天或您在 IIS 中设置的任何内容),则缓存对象将被删除。同样,不能保证对象在过期时保留在缓存中,这取决于可用内存等。
    • 所以这基本上提供了与静态对象引用相同的生命周期,但增加了灵活性,我可以像 IIS 一样控制过期,如果它需要回收一些内存?
    • @Eric J 是的。确切地。我认为这是首选的使用方法。通常我会在我的缓存对象上设置一些过期日期,尽管不需要。您还可以设置滑动过期时间,以便如果某个对象在某个时间段(例如 20 分钟)内没有被请求,则缓存会清除该项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多