中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

ASP.NETでInProcを使ってはいけない

この文書の最新版は
http://naka.wankuma.com/site/column/aspnet/00012.htm


この文書は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に変更した場合に問題になるのは何でしょうか?

  1. シリアル化可能であること
  2. Session_OnEndイベントが発生しないこと

おもにこの2点に注意しておけば大丈夫でしょう。

参考リンク
http://forums.microsoft.com/msdn-ja/ShowPost.aspx?PostID=274821&SiteID=7

投稿日時 : 2006年3月16日 12:48

コメントを追加

# アプリケーション・リスタートのタイミング 2008/06/10 0:03 のんびりゆこうよ@わんくま同盟

アプリケーション・リスタートのタイミング

# アプリケーション・リスタートのタイミング 2008/06/10 0:11 のんびりゆこうよ@わんくま同盟

アプリケーション・リスタートのタイミング

# re: ASP.NETでInProcを使ってはいけない 2017/12/01 15:30 kissanime

このような有益な情報をここで共有してくれてありがとう

タイトル  
名前  
URL
コメント