ユーザーのセッションが奇妙に振る舞うというASP.NET Webサイトに問題があります-セッションデータが表示され、消え、再表示されます。
私は問題が何であるかを知っていると思います:
- 私たちのセットアップは、2 x負荷分散Webサーバー+シングルセッション状態データベースです。
- ASP.NET SQLセッションステートストレージは、IIS WebサイトインスタンスID(メタベースID)に依存して、着信セッションCookie IDを一意に識別し、値を取得/保存するようです。
- ウェブサイトのIIS WebサイトのインスタンスIDは、ライブサーバーごとに異なっている(ID / W3SVC / 1 /ルート WebServerの上のA、ID / W3SVC / 2 /ルート WebサーバB上)。
- 負荷分散はクライアントアフィニティを使用していないため、各ユーザーのHTTP要求はいずれかのサーバーに送られます。
したがって、ユーザーがサイトにログオンして移動すると、各HTTP呼び出しはいずれかのWebサーバーに移動できるため、サーバーに応じて異なるIDを持つセッション状態レコードを使用できます。実際には、ユーザーは同時に2つの別々のセッションインスタンスを持ちます。私は、データベースのように、これを確認したと信じてASPStateTempSessionsの各セッションCookie IDが2に対応しているようだ、テーブルのほぼ-同じ名前(自分のIDが唯一の私はに基づいて修正されていると信じて、最後の数文字によって異なり、レコードのAppIDからAspStateTempApplicationsテーブル)互いに数秒以内に作成されます。
したがって、1つのセッションレコードに加えられた変更はそのWebサーバーに対してのみ持続するため、セッション状態は誤動作するように見えます。ユーザーが他の負荷分散サーバーに移動すると、セッション値は消えるか元に戻るように見えます。
ソリューションはサイトのIISインスタンスIDを同期すること(たとえば、両方を/ W3SVC / 1 / Rootにする)であると思いますが、詳細設定の下でIISでその値を編集しようとしました。サイトは、変更するまでそのサーバーで404を返します。
この問題に対応するVBSスクリプトを見つけましたが、IIS 6専用であるため、試してみるのが心配です。IIS 7.5で他の誰かがこの状況に遭遇しましたか。どのように修正しましたか?
編集/ソリューション
私の間違いは、IISでサイトインスタンスIDを変更した後にIISを再起動するのを忘れたことです。この後、IDが更新され、2つのWebサーバーでASP.NETセッションが同期されました。
完全な手順:
- サーバーLIVE1へのリモートデスクトップ、IIS Mgrを開き、問題のあるサイトをクリックして、サイドバーで[詳細設定]を選択します。
- IDを一意の値に変更します(10など)。[OK]をクリックします。
- Webサービスを再起動します(
c:\windows\system32\iisreset /restart
)
LIVE2についても同じことを行います(サイトIDがLIVE1と同じであることを確認してください)
サイトIDは、サイトファイルの場所に影響することに注意してください。たとえば、ログファイルフォルダーはC:\inetpub\logs\LogFiles\W3SVC10
、たとえば次のようになります。
また、各サーバーのIIS構成ファイルのサイトID属性を編集することにより、これらの変更を手動で実行できることにも注意してくださいC:\Windows\System32\inetsrv\config\applicationHost.config
。管理者特権が必要ですが、その後もリセットが必要です。