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

概要

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 - 最終更新日: 2004/01/30 - リビジョン: 1

フィードバック