HttpRuntime.Cache和Session有什么区别?

18

可能是重复问题:
缓存 v.s 会话

我正在使用一些使用HttpRuntime.Cache来存储值的代码。但是当我关闭窗口时,缓存就消失了。相对于Session,使用这种方式有什么好处吗?

这是我的代码:

protected dynamic Code()
{
    dynamic code;

    if (String.IsNullOrEmpty(myHttpContext.Request.QueryString["code"]))
    {
        code = HttpRuntime.Cache["code"];
    }
    else
    {
        code = myHttpContext.Request.QueryString["code"];
        HttpRuntime.Cache.Insert("code", myHttpContext.Request.QueryString["code"]);
    }

    return code;
}

protected string GetAccessToken(bool regenerate = false)
{
    if (HttpRuntime.Cache["access_token"] == null || regenerate == true)
    {
        try
        {
            Dictionary<string, string> args = GetOauthTokens(myHttpContext.Request.QueryString["code"]);
            HttpRuntime.Cache.Insert("access_token", args["access_token"], null, DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])), TimeSpan.Zero);
        }
        catch
        {
            OutputError("Code", "Bad Verification Code");
        }
    }

    return HttpRuntime.Cache["access_token"].ToString();
}
3个回答

25

HttpRuntime.Cache 是应用程序的全局缓存,它在网站所有用户/会话之间共享。

Session 是每个用户会话唯一的。一个用户会话中存储在 Session 中的内容只对该会话私有,另一个会话将有自己的存储空间。


嗨,HttpRuntime.Cache ["access_token"] 对所有用户都可见吗?这是教程中的写法,那么这将是一个非常大的安全漏洞! - Darren
1
根据https://dev59.com/ynI95IYBdhLWcg3wyRI0,会话也是每个工作线程独特的。 - Jeff
1
@Jeff。该问题指出,在正常的InProc会话存储中,Session是每个工作进程而不是每个线程唯一的。这种差异是巨大的 - ASP.NET总是使用许多线程,但只有在配置时才使用许多进程。对于多个工作进程,Session应该存储在外部进程中,这是可能的。 - Anders Abel

4
可能你看到缓存清空是因为当您重新运行站点时,您正在重启您的Web服务器。这会使得缓存对象和会话表现出相同的行为,实际上它们是非常不同的。
例如,在使用Visual Studio内置的Web服务器即运行网站作为Web应用程序时可能会发生这种情况。
只是一个想法。

1

Cache对象仅存在于内存中,并且对应用程序是全局的。ASP.NET可以随时从缓存中删除对象(尽管您可以通过向Cache.Add()传递参数来影响它)。当AppPool由于不活动而回收或关闭,或者如果您重新启动应用程序(例如通过更改web.config),则Cache也将被删除。

仅关闭网页本身是不足以清除缓存的。

会话对象对于每个用户会话是唯一的(通常对于每个浏览器实例是唯一的)。在每个请求结束时,它可以被序列化并存储在SQL Server中,或者只保留在内存中(InProc模式),或者被序列化并发送到名为StateServer的专用应用程序中。如果它存储在内存中,则会在与Cache相同的条件下丢失。如果写入SQL Server,则会在会话过期之前保留,即使AppPool回收。

请注意,您问题中的代码在读取/更新Cache对象时应使用lock()。否则,您可能会遇到潜在的竞争条件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接