我正在尝试创建一个缓存类来缓存页面中的某些对象。目的是使用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上也为空。
代码与页面本身不同(页面使用它)
感谢。
答案 0 :(得分:7)
有许多方法可以在ASP.NET中存储对象
您想要存储哪种类型的数据,以及如何相信它必须保留?
就在去年年初,我写了一篇关于我一直在编写的缓存框架的博客文章,它允许我做类似的事情:
// 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);
}
}