类中的ASP.NET对象缓存

时间:2011-01-03 15:23:19

标签: asp.net caching

我正在尝试创建一个缓存类来缓存页面中的某些对象。目的是使用ASP.NET框架的缓存系统,但将其抽象为单独的类。 似乎缓存不会持续存在。

任何想法我在这里做错了什么?是否有可能将对象缓存到页面本身?

编辑:添加了代码:

插入缓存

Cache c = new Cache();
c.Insert(userid.ToString(), DateTime.Now.AddSeconds(length), null, DateTime.Now.AddSeconds(length), Cache.NoSlidingExpiration,CacheItemPriority.High,null);

从缓存中获取

DateTime expDeath = (DateTime)c.Get(userid.ToString())

即使在我拥有密钥之后,我在c.Get上也为空。

代码与页面本身不同(页面使用它)

感谢。

3 个答案:

答案 0 :(得分:7)

有许多方法可以在ASP.NET中存储对象

  1. 网页级项目 - >页面上的属性/字段,可以在请求中的页面生命周期的生命周期内生效。
  2. ViewState - >以序列化的Base64格式存储项目,该格式通过使用PostBack的请求保留。控件(包括页面本身 - 它是一个控件)可以通过从ViewState加载它来保留它们之前的状态。这使得ASP.NET页面成为有状态的想法。
  3. HttpContext.Items - >在请求生命周期内存储的项目字典。
  4. 会话 - >通过会话提供多个请求的缓存。会话缓存机制实际上支持多种不同的模式。
    • InProc - 项目由当前进程存储,这意味着如果进程终止/回收,会话数据将丢失。
    • SqlServer - 项目被序列化并存储在SQL Server数据库中。 必须是可序列化的。
    • StateServer - 项目被序列化并存储在StateServer进程的单独进程中。与SqlServer一样,必须是可序列化的。
  5. 运行时 - 存储在运行时缓存中的项目将保留当前应用程序的生命周期。如果应用程序被回收/停止,则项目将丢失。
  6. 您想要存储哪种类型的数据,以及如何相信它必须保留?

    就在去年年初,我写了一篇关于我一直在编写的缓存框架的博客文章,它允许我做类似的事情:

    // Get the user.
    public IUser GetUser(string username)
    {
      // Check the cache to find the appropriate user, if the user hasn't been loaded
      // then call GetUserInternal to load the user and store in the cache for future requests.
      return Cache<IUser>.Fetch(username, GetUserInternal);
    }
    
    // Get the actual implementation of the user.
    private IUser GetUserInternal(string username)
    {
      return new User(username);
    }
    

    那是差不多一年前的事了,从那以后它已经有了一些进化,你可以阅读我的blog post关于它,请告诉我这是否有用。

答案 1 :(得分:3)

您的缓存引用需要可供代码中的所有项目使用 - 相同的参考。

如果你每次都在升级Cache课程,那你就错了。

答案 2 :(得分:2)

我做了几乎相同的事情,但使用不同的代码(并且它对我有用): (CacheKeys是一个枚举)

using System;
using System.Configuration;
using System.Web;
using System.IO;
    public static void SetCacheValue<T>(CacheKeys key, T value)
    {
        RemoveCacheItem(key);
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            DateTime.UtcNow.AddYears(1),
            System.Web.Caching.Cache.NoSlidingExpiration);
    }
    public static void SetCacheValue<T>(CacheKeys key, T value, DateTime expiration)
    {
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            expiration,
            System.Web.Caching.Cache.NoSlidingExpiration);
    }
    public static void SetCacheValue<T>(CacheKeys key, T value, TimeSpan slidingExpiration)
    {
        HttpRuntime.Cache.Insert(key.ToString(), value, null,
            System.Web.Caching.Cache.NoAbsoluteExpiration,
            slidingExpiration);
    }
    public static T GetCacheValue<T>(CacheKeys key)
    {
        try
        {
            T value = (T)HttpRuntime.Cache.Get(key.ToString());

            if (value == null)
                return default(T);
            else
                return value;
        }
        catch (NullReferenceException)
        {
            return default(T);
        }
    }