SQL Server セッション状態の非常に基本的なデモをセットアップしていますが、動作させるのに問題があります。IIS 7.5 および SQL Server 2008 R2 を使用して Windows 7 をローカルで実行して、これをテストしようとしています。
最終的に、いくつかの異なる Web サーバー間で負荷分散されるシステムにログインしているユーザーの数を追跡する方法が必要です。そのため、ユーザーがログインまたはログアウトするたびに、セッション変数 (SQL に格納されている) を更新する必要があります。したがって、セッション ID は常に異なる可能性があります。これは可能ですか?
これまでに行ったことは次のとおりです。
- IIS に 2 つの新しいサイト (Site1 と Site2) を作成しました。
- VS 2010 で 2 つの新しい Web アプリケーション プロジェクトを作成しました (Site1 と Site2)。
- 両方のサイトの Default.aspx ページで、クリックすると "Site1" または "Site2" (サイトによって異なります) を "LastSiteUsed" というセッション変数に保存するボタンを作成しました。クリックすると、「LastSiteUsed」セッション変数から値を読み取り、それをラベルに表示する別のボタンがあります。
- SQL で、dbSessionTest という名前の新しいデータベースを作成しました。次に、MSDN の指示に従い、aspnet_regsql ツールを使用してセッション状態データベースをインストールしました。
- 私の Web アプリケーションの両方の Web.config ファイルで、以下を の下に追加しました
<System.Web>
。
<sessionState mode="SQLServer" sqlConnectionString="server=.\sqlexpress;database=dbSessionTest;uid=myUsername;pwd=myPassword" cookieless="false" timeout="20" allowCustomSqlDatabase="true"/>
両方のサイトは正常に機能しますが、セッションを共有していないようです。たとえば、ボタンをクリックして Site1 からセッション変数を保存すると、Site2 からその値を読み取ることができると期待していましたが、うまくいきません。Site2 は「Site2」のみを返し、Site1 は「Site1」のみを返します。
私が間違っている可能性があることについて誰か考えがありますか? Site1 によって設定された値を Site2 から読み取ることができるはずだと考えるのは間違っていますか?
アップデート:
セッション データがASPStateTempSessions
SQL Management Studio のテーブルに格納されていることがわかりますが、各サイトは書き込んだ値しか見ることができません。両方のサイトは、次のようにセッション変数を設定しています。
Session("LastSiteUsed") = "Site2"
そして、両方のサイトが次のような値を取得しています:
lblValue.Text = "Value from Session: " & Session("LastSiteUsed").ToString
SQL Server に保存されているセッション変数にアクセスするには、これを別の方法で行う必要がありますか?
更新 2:
次のコマンドを実行して作成される既定のデータベース ASPState を使用してみました。
aspnet_regsql.exe -S MyServerName -E -ssadd -sstype p
次に、各 Web.config ファイルを次のように単純化しました。
<sessionState mode="SQLServer" sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword" cookieless="false" timeout="20"/>
しかし、やはり運が悪い。Site1 からセッション変数を設定し、Site2 から値を読み取れるようにしたいのですが、うまくいきません。ASPStateTempSessions
繰り返しになりますが、テーブルにエントリが表示されるので、正しく入力されていることがわかります。私が気づいたことの 1 つは、セッション ID が異なることです。
同じセッション変数を設定/読み取るときに、サイト間で同じセッション ID が使用されるようにするために、別の方法で行う必要があることはありますか?
更新 3:
SP を変更し、テーブルにグループ化するための列を追加するこの記事の指示に従いました。ASPStateTempApplications
この種の機能は機能しましたが、両方のサイトが同じブラウザーで (タブを使用して) 開いている場合に限ります。IE で Site1 を開き、セッション変数に値を保存し、ブラウザーを閉じて、Chrome で Site2 を開き、値を読み取れるようにする必要があります。私が SQL Server セッション状態で読んだことすべてから...これは可能であるはずです。
更新 4 - 解決策:
@SilverNinja が提供するこの記事の回答に従いました。コマンドプロンプトを介してデータベースを再作成しASPState
(更新#3でSPの変更を元に戻すため)TempGetAppID
、リンクからの回答に従ってSPを変更しました。また、その記事の回答と一致するように、両方の Web.config ファイルを更新しました。
<sessionState mode="SQLServer"
sqlConnectionString="Data Source=.\sqlexpress;User ID=myUsername;Password=myPassword;Application Name=CacheTest"/>
また、両方の Web.config ファイルに同一のマシン キーを含めました。
<machineKey validationKey="59C42C5AB0988049AB0555E3F2128061AE9B75E3A522F25B34A21A46B51F188A5C0C1C74F918DFB44C33406B6E874A54167DFA06AC3BE1C3FEE8506E710015DB" decryptionKey="3C98C7E33D6BC8A8C4B7D966F42F2818D33AAB84A81C594AF8F4A533ADB23B97" validation="SHA1" decryption="AES" />
これで、(IE を使用して) 両方のサイトを開き、Site1 から値を設定し、Site2 からそれを読み取ることができます (逆も同様です)。テーブルを確認すると、SessionID は 1 つしか存在しません (両方のサイトが同じセッションを正しく使用しています)。新しいブラウザー (たとえば、Chrome) を開くと同じセッションが使用されるという以前の私の考えは間違っていました。新しいブラウザーは独自のセッションを開始します。ただし、負荷分散されたシナリオでは、これによって問題が発生することはありません。