ASP.NETでInProcを使ってはいけない
この文書はVisual Studio 2005 TSかTE for SD(.NET 2.0)をベースに記述されていますが、Visual Studio 2002から同じことです。
ASP.NETをプロジェクトとして取り組んでいる方は、"あなたのプロジェクトはセッションモードをどうしますか?"と聞かれて即答できますか?
Visual Studio 2003のWeb.configを見てみましょう。
<!-- セッション状態の設定 既定では、ASP.NET は Cookie を使用して、要求がどのセッションに属するかを識別します。 Cookie が使用できない場合は、URL にセッション識別子を入力することで、セッションを見つけることができます。 Cookie を有効にするには、sessionState を cookieless="false" に設定してください。 --> <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
このように定義されています。
Visual Studio
2005ではWeb.configデフォルトで存在しないので、C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\CONFIG\web.config.comments
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config.comments
にデフォルト設定のコメントがあります。
<sessionState mode="InProc" ~略~ >
どちらもデフォルトはインプロセスモードということです。これはASP.NETが実際に稼動しているプロセス(プログラム)の内部に値を保持するという意味です。
ここでひとつ確認をして見ましょう。
このようにラベルとボタンだけをおきます。
ボタンのコードに以下のようなものを用意します。
C# protected void Button1_Click(object sender, EventArgs e) { if (Session["cnt"] == null) { Session["cnt"] = 1; } else { Session["cnt"] = (int)Session["cnt"] + 1; } this.Label1.Text = ((int)Session["cnt"]).ToString(); }
ボタンを押すと数字が数がカウントアップするサンプルですね。
うまく言っていることを確認します。
ここで、ASP.NET構成の設定で何かを変更してみましょう。
適用した後に、もう1度ボタンを押して見ましょう。
1になってしまいました。これはなぜでしょうか?
PRB: ASP.NET InProc セッション状態モードを使用すると、 Session Data が失われます。
http://support.microsoft.com/kb/324772/ja
[PRB] ASP.NET アプリケーションで断続的にセッション変数が失われる
http://support.microsoft.com/kb/316148/ja
Why does App restart? (FAQ) ←うにさんの日本語情報です
http://www.hollytown.net/uniblog/Comment/2005/02/18/0878.aspx
ASP.NETというレベルで見ると、これらの情報のとおり再起動したほうがいいと思ったタイミングで再起動されます。
うにさんのページには無いのですが、2.0の環境では内包ディレクトリを削除すると再起動されるようです。
また他にはIIS6(Windows Server 2003、Windows XP x64 Edition)には別途アプリケーションプールと言う考え方があります。
これらは設定次第で、分ごとやメモリの大量消費の都度自動的に再帰動します。
ASP.NETのアプリケーションは時にに大量の要求をこなす圧力にさらされています。時に大量の一時メモリを利用する圧力にさらされています。
これらの要求にこたえるためにも再起動は必要なのです。
さて、InProcからStateServerやSQL Serverに変更した場合に問題になるのは何でしょうか?
- シリアル化可能であること
- Session_OnEndイベントが発生しないこと
おもにこの2点に注意しておけば大丈夫でしょう。
参考リンク
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=274821&SiteID=7