2012-04-16 7 views
32

なぜASP.NET MVCアプリケーションでセッション変数を使用しないでください?私はthis answerを見に来ました。その場合、どのように私はユーザーの情報にログインし、彼のアカウントに関連するいくつかの関連データのようなリクエスト間で値を維持しますか?なぜASP.NET MVCアプリケーションでセッションが災害になるのですか?

これはDarinの答えです。

なぜ、ASP.NET MVCアプリケーションでHttpContext.Currentを使用していますか? 絶対に使用しないでください。これは古典的なASP.NET webformsの アプリケーションでさえ悪いですが、ASP.NET MVCではこの素晴らしいWebフレームワークからすべての楽しみを奪うのは厄介なものです ASP.NET MVCのようなフレームワークの基本的な原則の

+13

セッションを使用すべきではないとは言いませんでした(実際に私はこれを言っていましたが、私は今言っていますが、あなたがリンクしている回答ではありません)。私はあなたが現在のHTTPコンテキストにアクセスするために 'HttpContext.Current'を使うべきではないと言いました。 –

+0

ここでは、HttpContext.Currentを使用することが悪い考えである理由の1つを説明する記事があります。基本的にはスレッドセーフではありません:http://odetocode.com/articles/112.aspx – JTech

答えて

27

一つのWebがあるだけのように、彼らはステートレスであるということです。 ASP.NET Webフォームは、ステートレスな環境でステートフルなパラダイムを模倣する試みです。 It is a lie、換言すれば、

ASP.NET MVCアプリケーションでセッション変数を使用するのは、ホーンを馬の頭に縛り付けてUnicornと呼ぶようなものです。

+16

この部分は対処できますか? 「要求を超えて価値をどのように維持するのか」どうやら私はこれを間違ってやっています... – asawyer

+1

あなたのデータベースに格納してください。 http://www.asp.net/mvc、特にNerdDinnerのチュートリアルを確認してください。 –

+1

私の特別な場合のバッキングストアは時には非常に遅く、それぞれのアクションを打つのはちょうどうまくいきません=/ – asawyer

5

セッション状態を使用してデータを保持することができます。TempData機能は、セッションをデフォルトとして使用してデータを保持します。

可能な限りセッションの使用を最小限に抑える必要があります。その理由は、セッション状態の破損を防ぐためにすべての要求に対してセッションがロックされるためです。たとえば、複数のAjax要求がこれによりシリアル化されます。追加情報here

たとえば、要求の間にデータを保持するために、MVC Futuresの一部であるCookieValueProviderを使用して、モデルにクッキーデータをバインドすることができます。また、実際のDOMのデータを隠しフィールドとして保持することもできますが、データのサイズがブラウザとの間のネットワークトラフィックに反映されるため、できるだけこれらを最小限に抑える必要があります。

メインストアが遅い場合は、Webアプリケーション用に別のデータストアを使用することを検討します。 SQLServer CEや埋め込みRavenDBなどです。

+0

これらはシリアライズしないで同期化します。 – KingOfHypocrites

+0

パラレルリクエストの同期化によりシリアル化が発生する(1つずつ) –

+0

シリアルイベントは、シリアルイベントが順番に繰り返されるため、一般にメモリ内のデータを取り込んでディスクに格納できる形式にするときに参照されます。 – mikeschuld

関連する問題