2

stackoverflow の最初の投稿です。素晴らしいフィードバックをお待ちしております :)

現在、Web サイトの負荷分散を試みています。IIS 6 を使用して Windows Server 2003 に 2 クラスターの NLB をセットアップしました。

セットアップをテストしているときに、セッションが失われることがあることがわかりました。1日半後、結果は次のとおりです。

  1. はい、machine.config は両方とも同じ暗号化/復号化キーを持っています。
  2. はい、iis metabase.xml の ID は両方のマシンで同じです。実際には、「AdminACL」を除いて、ファイル全体が同じです。
  3. 両方の Web アプリケーションが「StateServer」で設定され、両方が同じマシンを指しています。

その時点から、Google で検索すると、より少ない情報と考えられる解決策が得られます。

私の知る限り、この問題を引き起こす特定のパターンはありません。たまにしか起こりません。

問題を見つけようとしているときに、リクエストが asp セッション ID Cookie をサーバーに送信したが、サーバーがそれをユーザー セッションにマップしていないことがわかりました。

ということで、クライアントからリクエスト番号xが送られてきて、cookieでセッションがマッピングされ、スムーズに進みました。クライアントからリクエスト番号 x+1 が Cookie とともに送信されましたが、セッションが見つかりませんでした。

両方の要求は、NLB の同じマシンで行われました。

asp trace.axd のスニペットを次に示します。

最初のリクエスト:

リクエストの詳細 セッション ID: j2ffvy45updpc52uhw1mbg55 リクエスト タイプ: GET リクエストの時刻: 11/26/2008 2:58:06 PM ステータス コード: 200 リクエストのエンコーディング: Unicode (UTF-8) レスポンスのエンコーディング: Unicode (UTF-8)

Cookie コレクションのリクエスト

名前 値 サイズ

ASP.NET_SessionId j2ffvy45updpc52uhw1mbg55 42 AID 22 9

応答 Cookie コレクション

名前 値 サイズ

ヘッダー コレクション

名前 値

Cookie ASP.NET_SessionId=j2ffvy45updpc52uhw1mbg55; AID=22

2 番目の要求:

リクエストの詳細 セッション ID: リクエスト タイプ: POST リクエストの時刻: 11/26/2008 2:58:08 PM ステータス コード:
リクエストのエンコード: Unicode (UTF-8) レスポンスのエンコード:

Cookie コレクションのリクエスト

名前 値 サイズ

応答 Cookie コレクション

名前 値 サイズ

ヘッダー コレクション名 値 Cookie ASP.NET_SessionId=j2ffvy45updpc52uhw1mbg55; AID=22

2 番目の要求でわかるように、Cookie はクライアントから送信されますが、asp は「Request Cookies Collection」に Cookie を追加しないようです。それがセッションを見つけられない理由だと思います。

では、なぜ Cookie がセッションにマップされないのでしょうか? それが問題ですか?問題は他の場所にありますか?

ご不明な点がございましたら、お気軽にお問い合わせください。

フィードバックをお寄せいただきありがとうございます。

JF

4

8 に答える 8

1

私はついに私の問題に対する答えを見つけました。その起源はアプリケーション コード内にあります (プログラマーのサード パーティ ツールの「バグ」の 99% のように)。誰かが同様のシナリオにある場合に備えて、とにかく投稿することにしました。

このコードは WebServiceRequester クラスの一部でした。Web サービス リクエスター クラスは、セッションの作成時にインスタンス化され、セッションに保存されます。作成中に、メンバー 'm_webServiceURL' を初期化し、このメンバーは後にセッションに保存されます。このメンバーが初期化される値は、ローカル マシンの設定に依存していました。

重要な部分は次のとおりです。 WebServiceRequester クラスには WebService オブジェクトが含まれています。WebService オブジェクトはセッションに保存できず、asp でシリアル化できません。プロパティには [NonSerialized] 属性がありました。そのため、ページのライフ サイクル中に最初にオブジェクトの「WebService」プロパティにアクセスするたびに、新しいオブジェクトを作成し、セッションに保存された URL「m_webServiceURL」を割り当てる必要がありました。ご覧のとおり、新しい Web サービス オブジェクトは、おそらく別のマシン上にあり、各マシン上で異なる設定を意味します。

ボックス 29 は、localhost で Web サービスにアクセスするように設定されました。

ボックス 30 は、192.168.253.29 として Web サービスにアクセスするように設定されました。

技術的には、両方とも同じマシンに設定されています。しかし、ここにシナリオがあります:

ボックス 29 にログインします。m_webServiceURL はセッションで localhost に設定されます。

[ボックス 29 に関するいくつかのリクエストはこちら]

ボックス 30 では、NLB のバランスをとっています。ボックス 30 では、セッションをロードし、Web サービス アドレスとして localhost を使用して新しい Web サービス オブジェクトを作成します。ボックス 30 が間違った Web サービスにリクエストを送信し、セッション期限切れの例外が発生しました。

デバッグ中の問題の 1 つは、ローカル通信がネットワーク モニターで記録されなかったことです。

トレースで私を導いたのは、ボックス 29 のログ トレースに例外が記録されていなかったということです。

皆さんの提案に感謝します。本当に感謝しています。

良い一日を過ごしてください。JF

于 2008-12-03T20:43:28.857 に答える
0

コードを使用してasp.net_sessionidのドメイン名を「.yourdomain.com」に設定してみてください。デフォルトでは、ASP.net_SessionIDCookieドメイン名は完全なアプリケーションパスに設定されています。したがって、これがCookieが移動しない理由の1つである可能性があります。

例:Request.Cookies["ASP.NET_SessionId"]。Domain=".yourdomain.com"。最初の「。」を覚えておいてください。ドメイン名で重要です。

これは、AcquireRequestStateイベントのHttpModuleで実行できます。

于 2008-11-28T06:05:16.257 に答える
0

SQL をいじる代わりに、IIS ノードの 1 つにテストを直接送信して、同じ問題が発生するかどうかを確認してください。少数のテストのみを行う場合 StateServer は問題にならないでしょう。

于 2008-11-28T05:17:55.307 に答える
0

あなたの質問に対する厳密な回答ではありませんが、SQL Server ベースのセッション ストアを使用して試してみましたか? (MSDN で、asp.net で提供されている一時スクリプトではなく、永続スクリプトを検索してください)

実行可能セッション サービスについて「悪いこと」を聞いたことがあります。そのため、使用していません。ただし、SQL Server ベースのソリューションで Web ファーミングに問題が発生したことはありません。

申し訳ありませんが、あなたの問題に対する厳密な回答ではありませんが、(a) 修正するか、(b) 大幅に絞り込む必要があります。

于 2008-11-26T21:50:45.943 に答える
0

Visual Studio を使用している場合は、少なくとも MSDE (Visual Studio に付属している SQL Server の縮小バージョン) でテストできます...

状態サーバーの問題を除外するのに役立つかもしれません...

于 2008-11-26T22:03:01.193 に答える
0

私は足が不自由で、MS SQL Server の提案を繰り返します。商用利用を含め、完全に無料の SQL Server Express をインストールします。この段階では問題にならない次の 3 つの欠点しかありません。

  • 最大 4GB サイズのデータ​​ベース
  • 最大 1 CPU コアを使用
  • 最大 1GB の RAM を使用
于 2008-11-27T00:47:15.167 に答える
0

データベース アプローチの使用には、独自の問題があります。お好みのアプローチを使用できるはずだと思います。

おそらく、このセッションのトラブルシューティング記事が役に立ちますか?

または「ASP.NET でのセッション関連の問題のトラブルシューティング

または「期限切れの ASP.NET セッション状態とオプションのトラブルシューティング

于 2008-11-26T22:31:11.730 に答える
0

考慮すべきいくつかの点:

  • あなたのウェブサイトの負荷は?State Server は、多数の同時ヒットに直面するとクラッシュする傾向があります。これは、ユーザー数が非常に少ないシナリオ (10 代、主にバックエンド システム) でのみ使用しています。毎日何千人ものユーザーにサービスを提供するサイトの本番環境で使用しようとすると、クラッシュしてセッション データが失われました。
  • 私たちが管理している実稼働環境の 1 つで、MSSQL 2005 Express を使用してセッションを管理しています。サイトには 1 日に 1 万人以上のユーザーと 1 日に 20 万以上のページがあります。これは、セッションが必須であり、アプリケーションに密接に結合されている場合に推奨されるアプローチです。

MSSQL Express を状態 DB として使用しようとしている場合は、SQL Server エージェントが付属していないことに注意してください。つまり、バックグラウンドで実行され、期限切れのセッションをクリーニングするタスク スケジューラがないことを意味します。スケジューラを見つけて、クリーンな期限切れセッション ストアド プロシージャを定期的に実行することをお勧めします。

幸運を

于 2008-11-28T03:18:07.360 に答える