什么是HttpRuntime.Cache和Session之间的区别?

时间:2011-12-21 22:12:17

标签: c# asp.net session

  

可能重复:
  Cache v.s Session

我正在使用一些使用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 个答案:

答案 0 :(得分:23)

HttpRuntime.Cache是应用程序的全局;它在网站的所有用户/会话中共享。

每个用户会话

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

答案 1 :(得分:4)

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

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

只是一个想法。

答案 2 :(得分:1)

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

仅仅关闭网页本身就不足以放弃缓存。

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

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

相关问题