HttpRuntime.Cache 和 Session 有什么区别

本文关键字:什么 区别 Session Cache HttpRuntime | 更新日期: 2023-09-27 18:18:37

可能的重复项:
缓存与会话

我正在使用一些使用 HttpRuntime.Cache 来存储值的代码。但是,当我关闭窗口时,缓存会消失。在会话中使用它有什么好处吗?

这是我的代码:

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();
}

HttpRuntime.Cache 和 Session 有什么区别

HttpRuntime.Cache

应用程序的全局文件;它在网站的所有用户/会话之间共享。

Session每个用户会话都是唯一的。一个用户会话存储在Session中的内容对该会话是专用的。另一个会话将有自己的存储。

您看到缓存清除的原因可能是您在重新运行站点时重新启动了Web服务器。这将使缓存对象和会话的行为方式看起来相同,而实际上它们非常不同。

例如,当使用Visual Studio的内置Web服务器时,即将站点作为Web应用程序运行时,可能会发生这种情况。

只是一个想法。

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

仅关闭网页本身不足以删除缓存。

会话

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

请注意,问题中的代码在读取/更新缓存对象时应使用 lock((。否则,您将面临潜在的争用条件。