是否有可以用作缓存键名称的会话唯一标识符?

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";