ASP.NET Webアプリケーションでは、ユーザー固有の変数は、staticではなくて、Session変数で保存すべきです。
static変数を使うのは、とても注意が必要です。
理由は次の通りです。
Webアプリケーションでstatic変数を使うのは要注意!
たとえば、以下のサンプルアプリケーションがあったとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
namespace WebApplication1 { public partial class WebForm1 : System.Web.UI.Page { public static int customerID; protected void Page_Load(object sender, EventArgs e) { } protected void ButtonSetCustomerID_Click(object sender, EventArgs e) { customerID = Convert.ToInt32(TextBox1.Text); } protected void ButtonGetCustomerID_Click(object sender, EventArgs e) { Label1.Text = Convert.ToString(customerID); } } } |
もし、2人のユーザーが同時にログインして、一人目が値を100にセットし、更に二人目がその値を200にセットしたとします。
一人目がこの後、Getボタンを押せば、結果は200となります。
static変数はユーザーを横断して保持されるために、Webアプリケーションでは注意が必要です。
上記のケースの場合、customerIDは次のようにSessionに保持されるプロパティとして定義すれば、あたかも、変数であるかのように扱えて便利です。
1 2 3 4 5 |
public int customerID { get { return session["customerID"] == null? -1 : (int)session["customerID"]; } set { session["customerID"] = value; } } |
Session変数の更新は、InProcモードでしか反映されない
ASP.NETのセッションには以下の3種類あります。
- InProc
- StateServer
- SQLServer
これらは、web.config の中の sessionState mode で指定します。
StateServerはwindowsサービス、SQLServerはDBという違いはありますが、両者ともにシリアライズ可能なオブジェクトのみ格納でき、InProcと違いワーカープロセスのリサイクル等でセッションは破棄されず信頼性も高いという位置づけです。
モード | 管理 | メリット | デメリット |
---|---|---|---|
InProc | ASP.NETワーカープロセス | Webサーバメモリ上管理のため最速。 Session_OnEndイベントが発生する。 |
Webアプリケーション、ワーカープロセスのリサイクル等でセッション情報が失われる。 冗長構成にできない |
StateServer | ASP.NET状態サービス(aspnet_state.exe) | Webアプリケーション、ワーカープロセスのリサイクルが発生してもセッションが保護される。 SQLServerよりは高速。 Webサーバと別サーバで動作可能 |
冗長構成にできない。 |
SQLServer | SQLServer | Webアプリケーション、ワーカープロセスのリサイクルが発生してもセッションが保護される。 冗長構成可能。 信頼性が最も高い。 |
3つの中では最も低速 |
Session変数を更新した場合、更新はInProcモードでしか反映されません。
StateServerモードの場合、Session変数を更新しても反映されない点は要注意です。
StateServerモードでユーザー固有の変数を持つには、Session IDと変数をハッシュテーブルにもって保持する必要があります。
Maintain a dictionary in your thread class with key as Session id and value is your hash-table, So if page2.aspx wants to read value of hash-table then it will pass his session id to method and which will return required value.
プログラミングの無料レッスン体験
約8,000名の受講生と80社以上の導入実績のあるプログラミングやWebデザインのオンラインマンツーマンレッスンCodecamp
<Codecampの特徴>
1 現役エンジニアによる指導
2オンラインでのマンツーマン形式の講義
3大手企業にも導入されている実践的なカリキュラム
↓無料体験レッスン実施中です。
コメント