В чем разница между HttpRuntime.Cache и Session?

Возможный дубликат:
Cache v.s Session

Я использую некоторый код, который использует 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();
}

Ответы

Ответ 1

HttpRuntime.Cache является глобальным для приложения; он распространяется среди всех пользователей/сеансов веб-сайта.

Session является уникальным для каждого сеанса пользователя. То, что один сеанс пользователя хранит в Session, является приватным для этого сеанса. Другой сеанс будет иметь собственное хранилище.

Ответ 2

Возможно, причина, по которой вы видите, что кэш очищен, - это перезапуск веб-сервера при повторном запуске вашего сайта. Это создало бы впечатление, что объект кэша и сеанс ведут себя одинаково, когда на самом деле они очень разные.

Это может быть, например, это происходит при использовании Visual Studio, встроенной в веб-сервер, т.е. при запуске сайта в качестве веб-приложения.

Просто мысль.

Ответ 3

Объект Cache живет только в памяти и является глобальным для приложения. Объекты могут быть удалены из кэша в любой момент ASP.NET(хотя вы можете в какой-то мере повлиять на аргументы Cache.Add()). Когда AppPool перерабатывает или отключается из-за неактивности, или если вы перезапустите приложение (например, изменив web.config), кэш также будет удален.

Просто закрыть веб-страницу недостаточно для того, чтобы сбросить кеш.

Объект Session уникален для каждого сеанса пользователя (обычно уникального для каждого экземпляра браузера). В конце каждого запроса он может быть либо сериализован, либо храниться на SQL Server, либо просто храниться в памяти (в режиме InProc), либо сериализован и отправлен в специализированное приложение, называемое StateServer. Если он хранится в памяти, он будет потерян при тех же условиях, что и кэш. Если он написан на SQL Server, он будет храниться до истечения срока действия сеанса, даже если AppPool будет перерабатываться.

Обратите внимание, что код в вашем вопросе должен использовать lock() при чтении/обновлении объекта Cache. В противном случае у вас есть потенциальное состояние гонки.