【问题标题】:Whats the difference between HttpRuntime.Cache and Session? [duplicate]HttpRuntime.Cache 和 Session 有什么区别? [复制]
【发布时间】:2012-01-25 16:39:22
【问题描述】:

可能重复:
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();
}

【问题讨论】:

    标签: c# asp.net session


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,所有用户都可以看到 HttpRuntime.Cache["access_token"]?教程里是这样写的,那将是一个非常大的安全漏洞!
    • 根据stackoverflow.com/questions/2151251/…,每个工作线程的会话也是唯一的
    • @Jeff。该问题表明,对于普通 InProc 会话存储,Session 对于每个工作人员 process 是唯一的,而不是每个 thread。区别是巨大的——ASP.NET 总是使用许多线程,但只有在这样配置时才会使用许多进程。对于多个工作进程,Session 可能应该存储在进程外,这是可能的。
    【解决方案2】:

    您看到缓存被清除的原因可能是您在重新运行网站时正在重新启动 Web 服务器。这会让人觉得缓存对象和会话的行为方式相同,但实际上它们非常不同。

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

    只是一个想法。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-22
        • 2014-06-27
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        • 2015-11-23
        • 2013-02-13
        • 2011-04-26
        相关资源
        最近更新 更多