現在オフラインです。再接続するためにインターネットの接続を待っています

[ASP] フレームセットで ASP を使用するとセッション変数が失われる

この記事は、以前は次の ID で公開されていました: JP178037
概要
Active Server Pages(ASP) のページで定義したセッション変数の値が、フレームセットの中の他の ASP ページからアクセスすると値が設定されていません。
現象
以下の条件でこのエラーが発生します。
  • セッション変数が、Global.asa(下記の注意も参照) では無く ASP ファイルで初期化されている。
  • 2つ以上の ASP ファイルがフレームセットにロードされている。
ASP ファイルをフレーム機能によって表示する場合は、フレームセットの中のそれぞれの ASP ファイルのために新しいセッションが開始されます。同様に、Session_OnStart サブルーチンはそれぞれの ASP ファイルごとに一回、呼び出されます。

Active Server Pages は cookie を使用してセッションを管理します。ASP ファイルを含むフレームセットを使用する場合は、すべてのフレームセットがロードされるまで cookie はブラウザに返されません。この理由により、セッションがまだ確立していない (セッション選別子の cookie がブラウザに送られていない) 場合でも、Active Server Pages はフレームセットの中のそれぞれの ASP ファイルに新しいセッションを作成します。

注意:セッション変数が Global.asa の Session_OnStart で初期化され、(たとえば、何人がページをアクセスしているかを表示するため)変数がインクリメント(1 加算)されている場合、結果としてフレームセットに存在する ASP ページの数が加算されてしまいます。この動作はフレームセットのそれぞれの ASP ファイルが Session_OnStart を実行するからです。
回避策
Active Server Pages は必要不可欠な時だけセッションを管理します(たとえば、セッション変数が作成された時)。この問題を回避するためには、フレームセットを使用する前にセッションを確立することです。多くの場合、このための最も簡単な方法は、FRAMESET を定義している HTML ファイルを ASP ファイルに変更することです。
詳細
以下のファイルを作成してください:
Main.htm:   <HTML>   <HEAD>   <TITLE>Document Title</TITLE>   </HEAD>   <BODY>   <FRAMESET FRAMEBORDER=0 SCROLLING=YES ROWS="15%, 70%, *">       <FRAME NAME="Top" SCROLLING="NO" SRC="Top.asp">       <FRAME NAME="Middle" SCROLLING="AUTO" SRC="Middle.asp">       <FRAME NAME="Bottom" SCROLLING="NO" SRC="Bottom.asp">   </FRAMESET>   </BODY>   </HTML>Top.asp:   <%@ LANGUAGE="VBSCRIPT" %>   <HTML>   <HEAD>   </HEAD>   <BODY>   <% Response.Write("Top.asp: " & Session.SessionID )      ' このフレームセットのすべての ASP ファイルから参照したいセッション変数      session("GlobalVar")="Top" %>   </BODY>   </HTML>Middle.asp:   <%@ LANGUAGE="VBSCRIPT" %>   <HTML>   <HEAD>   </HEAD>   <BODY>   <% Response.Write("Middle.asp: " & Session.SessionID ) %>   <SCRIPT LANGUAGE="VBScript">      Sub CommandButton1_Click()         'top.asp で設定した変数の表示         msgbox "<%=session("GlobalVar")%>"      end sub   </SCRIPT>   <OBJECT ID="CommandButton1" WIDTH=96 HEIGHT=32     CLASSID="CLSID:D7053240-CE69-11CD-A777-00DD01143C57">        <PARAM NAME="Caption" VALUE="display gvar">        <PARAM NAME="Size" VALUE="2540;846">        <PARAM NAME="FontCharSet" VALUE="0">        <PARAM NAME="FontPitchAndFamily" VALUE="2">        <PARAM NAME="ParagraphAlign" VALUE="3">   </OBJECT>   </BODY>   </HTML>Bottom.asp:   <%@ LANGUAGE="VBSCRIPT" %>   <HTML>   <HEAD>   </HEAD>   <BODY>   <% Response.Write("Bottom.asp: " & Session.SessionID ) %>   <% Session("MyVar") = "Bottom" %>   </BODY>   </HTML>
ブラウザで Main.htm を開くとセッション選別子がすべて異なっています。また、"display gvar"ボタンをクリックすると、セッション変数の値も表示されません。
(この現象は Main.htm を最初に開いた時だけ発生します。セッション確立後にもう一度 Main.htm を開くとセッション選別子はすべて同じになります。)
回避策
Main.htm のファイル名を Main.asp に変更し、</FRAMESET> タグの後に以下の行を追加してください。
   <% Session("MyVar") = "Main" %>
これにより、セッションが 1 つだけ作成され、セッションの終了まで保持されます。ブラウザで Main.asp を開くとセッション選別子がすべて同じ値となり、"display gvar"ボタンをクリックすると、セッション変数の値として"top"が表示されるようになります。
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 178037 (最終更新日 1998-02-09) をもとに作成したものです。

プロパティ

文書番号:178037 - 最終更新日: 01/30/2004 21:26:00 - リビジョン: 1.0

Microsoft Active Server Pages 4.0, Microsoft Internet Information Server 4.0, Microsoft Internet Information Services 5.0, Microsoft Internet Explorer 5.0

  • kbinfo KB178037
フィードバック
body>"text/JavaScript" async=""> var varAutoFirePV = 1; var varClickTracking = 1; var varCustomerTracking = 1; var Route = "76500"; var Ctrl = ""; document.write("