
ページの更新の間にユーザーのセッションが変わる問題を調査するタスクが与えられました。すぐに (Web サイトについて何も知らなかったため)、負荷分散/Web クラスター構成の問題のようだと言いました。しかし、後で Web サイトは負荷分散されておらず、単一のサーバーであることがわかりました。
アプリケーションには、セッションに保存されるバスケット オブジェクトがあります。ユーザーはバスケットなどにアイテムを追加します。バスケット ページでページを更新すると、バスケット内のアイテムが変更され、場合によってはアイテムがなくなることもあります。
セッションは失われず、次の更新時にほぼ常に戻りますが、次の更新時にバスケットが空になったり、異なるコンテンツが含まれることがあります。この動作はこれまで何度も見たことがありますが、マルチサーバー設定の場合のみです。
これは、開発環境で再現しようとしたが成功しなかったものです。問題を再現することはできないのですが、実際の環境では頻繁に発生します。
Web アプリケーションは、Windows Server 2008 R2 および IIS 7.5 上の .NET 4.0 で実行される ASP.NET WebForms サイトです。
セッション状態モードは InProc で、セッション タイムアウトは 480 分に設定されています。
私は Fiddler を使用してリクエストと応答を確認しましたが、サーバーに渡される ASP.NET セッション ID は毎回同じでした。返される実際の HTML 以外に、応答に違いはないようです。
この問題の原因について何か考えをお持ちの方はいらっしゃいますか?
アップデート1:
同僚がバスケット コードに実装したログの一部を修正しました。異なるデータが表示されても、セッション ID は同じままで、セッション変数の値も同じままであることがわかります。
申し訳ありませんが、これを投稿する前にログを確認すべきでした。
ただし、これはサーバーの問題であると確信しています。コードはテスト環境では期待どおりに動作します。
答え1
「負荷分散/Web クラスター構成の問題のようだと言いました。しかし、後で分かったのですが、Web サイトは負荷分散されておらず、単一のサーバーです。」
単一のサーバーだからといって、負荷分散が行われていないわけではありません。IIS には、Web 作業を複数のプロセスに分割し、複数の CPU に分散できるようにする「Web ガーデン」と呼ばれる機能があります。
それは小さな「Web ファーム」のようなもので、そのため「Web ガーデン」という名前が付けられています。 :)
Webガーデンを使用すると、ページリクエストごとに異なるワーカープロセスが実行されるため、InProcセッション変数が正しく動作しなくなるという影響があります。InProc(In Process)は、常に次の条件を満たす場合にのみ確実に動作します。同じプロセスで。
解決策1:
- IIS が Web ガーデンを使用するように設定されていないことを確認します。これを行うには、次の手順を実行します。
- IIS マネージャーを開きます。
- Web アプリが使用している App Pool を特定します。
- アプリプールを右クリックして「詳細プロパティ「」。
- 下にスクロールして「最大ワーカープロセス数" に
1
。
解決策2:
- すべてのワーカー プロセスのセッション状態を管理することを唯一のタスクとするセッション状態サーバーを使用します。
- 次に、Web アプリを InProc から StateServer に変更します。
- チェックアウトセッション状態を維持するための状態サーバーを構成する (IIS 7)まずはそれを始めましょう。:)
この MSDN ブログをご覧ください:インプロセスセッション状態管理
セッション状態のオプションと、InProc セッション損失のトラブルシューティング方法について説明します。
答え2
長い間コードを変更していません。(最終変更: 2016 年 7 月 20 日)
しかし、Windows Server 2016 でも同じ問題が発生しています。顧客が Windows 2012 R2 を Windows 2016 にアップグレードしていました。この問題を解決できませんでした。
その後、古いサーバー(Windows 2012 R2)にダウングレードしました。問題は解決しました。バグだと思いますが、確信はありません。
たぶんそれはあなたを助けるでしょう。