是否有可以用作缓存键名称的会话唯一标识符?
Is there a Session-unique identifier that can be used as a cache key name?
我正在将遗留 ASP.NET WebForms 应用程序移植到 Razor。它在 Session 集合中存储了一个对象。会话存储现在仅限于 byte[] 或 string。一种技术是序列化对象并存储为字符串,但有一些注意事项。另一篇文章建议使用其中一个替代缓存选项,因此我正在尝试使用 MemoryCache。
为了将其用作会话替换,我需要一个对用户及其会话唯一的密钥名称。
我想我会为此使用 Session.Id
,像这样:
ObjectCache _cache = System.Runtime.Caching.MemoryCache.Default;
string _keyName = HttpContext.Session.Id + "$searchResults";
//(PROBLEM: Session.Id changes per refresh)
//hit a database for set of un-paged results
List<Foo> results = GetSearchResults(query);
if (results.Count > 0)
{
//add to cache
_cache.Set(_keyName, results, DateTimeOffset.Now.AddMinutes(20));
BindResults();
}
//Called from multiple places, wish to use cached copy of results
private void BindResults()
{
CacheItem cacheItem = _cache.GetCacheItem(_keyName);
if (cacheItem != null) //in cache
{
List<Foo> results = (List<Foo>)cacheItem.Value;
DrawResults(results);
}
}
...但是在测试时,我看到任何浏览器刷新,或页面 link 单击,都会生成一个新的 Session.Id
。那是有问题的。
是否有另一个内置 属性 可以用来识别用户会话并用于此键名目的的地方?一个将通过浏览器刷新和网络应用程序中的点击保持静态?
谢谢!
Yiyi You 链接到的答案对此进行了解释——Session.Id
不会是静态的,直到您首先将某些内容放入 Session 集合中。像这样:
HttpContext.Session.Set("Foo", new byte[] { 1, 2, 3, 4, 5 });
_keyName = HttpContext.Session.Id + "_searchResults";
我正在将遗留 ASP.NET WebForms 应用程序移植到 Razor。它在 Session 集合中存储了一个对象。会话存储现在仅限于 byte[] 或 string。一种技术是序列化对象并存储为字符串,但有一些注意事项。另一篇文章建议使用其中一个替代缓存选项,因此我正在尝试使用 MemoryCache。
为了将其用作会话替换,我需要一个对用户及其会话唯一的密钥名称。
我想我会为此使用 Session.Id
,像这样:
ObjectCache _cache = System.Runtime.Caching.MemoryCache.Default;
string _keyName = HttpContext.Session.Id + "$searchResults";
//(PROBLEM: Session.Id changes per refresh)
//hit a database for set of un-paged results
List<Foo> results = GetSearchResults(query);
if (results.Count > 0)
{
//add to cache
_cache.Set(_keyName, results, DateTimeOffset.Now.AddMinutes(20));
BindResults();
}
//Called from multiple places, wish to use cached copy of results
private void BindResults()
{
CacheItem cacheItem = _cache.GetCacheItem(_keyName);
if (cacheItem != null) //in cache
{
List<Foo> results = (List<Foo>)cacheItem.Value;
DrawResults(results);
}
}
...但是在测试时,我看到任何浏览器刷新,或页面 link 单击,都会生成一个新的 Session.Id
。那是有问题的。
是否有另一个内置 属性 可以用来识别用户会话并用于此键名目的的地方?一个将通过浏览器刷新和网络应用程序中的点击保持静态?
谢谢!
Yiyi You 链接到的答案对此进行了解释——Session.Id
不会是静态的,直到您首先将某些内容放入 Session 集合中。像这样:
HttpContext.Session.Set("Foo", new byte[] { 1, 2, 3, 4, 5 });
_keyName = HttpContext.Session.Id + "_searchResults";