2011-12-21 4 views
14

可能性の重複:
Cache v.s SessionHttpRuntime.Cacheと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(); 
} 

答えて

22

HttpRuntime.Cacheは、アプリケーションのグローバルです。それはウェブサイトのすべてのユーザ/セッションで共有されます。

Sessionは、ユーザーセッションごとに一意です。 Sessionに格納されている1つのユーザーセッションは、そのセッションに対してプライベートなセッションです。別のセッションには独自のストレージがあります。

+0

こんにちはHttpRuntime.Cache ["access_token"]はすべてのユーザーに表示されますか?これはチュートリアルで書かれた方法ですが、これは非常に大きなセキュリティ上の脆弱性になります! – Darren

+1

セッションは、http://stackoverflow.com/questions/2151251/asp-net-web-garden-how-many-worker-processes-do-i-needに従って、ワーカースレッドごとに一意です。 – Jeff

+1

@Jeff。その質問は、通常のInProcセッションストレージでは、 'Session'は* thread *ではなく、ワーカー*プロセス*で一意であると述べています。違いは巨大です - ASP.NETは常に多くのスレッドを使用しますが、設定されている場合のみ多くのプロセスが使用されます。複数のワーカープロセスでは、 'Session'はおそらく可能なプロセス外に格納されるべきです。 –

4

おそらく、キャッシュをクリアしている理由は、サイトを再実行しているときにWebサーバーを再起動しているためです。これにより、キャッシュオブジェクトと同じように見えるようになり、実際には非常に異なっている場合と同じように動作していました。

たとえば、Visual StudioのビルトインWebサーバーを使用している場合、つまりWebアプリケーションとしてサイトを実行している場合などです。

単なる考えです。

1

キャッシュオブジェクトはメモリ内にのみ存在し、アプリケーションに対してグローバルです。オブジェクトはいつでもASP.NETから削除できます(ただし、Cache.Add()への引数である程度影響を受けることがあります)。 AppPoolが非アクティブなためにリサイクルまたはシャットダウンするとき、またはアプリケーションを再起動した場合(web.configの変更など)には、キャッシュも削除されます。

ウェブページを閉じるだけでは、キャッシュを削除するだけでは不十分です。

セッションオブジェクトは、ユーザーセッションごとにユニークです(通常、ブラウザインスタンスごとに一意です)。各要求の最後には、シリアル化してSQL Serverに格納するか、メモリに保存する(InProcモード)か、シリアル化してStateServerという特殊なアプリケーションに送信することができます。メモリに保存されている場合は、キャッシュと同じ条件で失われます。 SQL Serverに書き込まれている場合、AppPoolがリサイクルしてもセッションが終了するまで保持されます。

Cacheオブジェクトの読み取り/更新時に、問題のコードでlock()を使用する必要があることに注意してください。それ以外の場合、潜在的な競合状態になります。

関連する問題