登録プロセスの一連の手順をユーザーに実行させるカスタム SharePoint 2010 Web パーツがあります。各ステップで、必要な入力が完了すると、ユーザーは標準のサーバー側ボタン コントロールである [続行] ボタンをクリックします。コード ビハインドは、更新されたセッション データで同じページを更新する Response.Redirect を呼び出す前に、いくつかの検証と DB の更新を行います。
(注: セッション データは、従来の Session オブジェクトではなく、暗号化されたクエリ文字列パラメーターとして URL に保持されます)
このソリューションは、単一サーバーのテスト環境では正常に機能しますが、負荷分散されたステージまたは運用環境に展開するとすぐに、[続行] をクリックした後、一部の要求が応答を受信せずにタイムアウトになります (ERR_TIMED_OUT)。
- Web パーツ ログは、Web パーツが実際に有効な URL を使用して Response.Redirect を呼び出していることを示しています。
- これはサーバー リソースの問題ではありません。タイムアウトは 1 分以上に設定でき、応答は受信されません。
- 負荷分散されたサーバーにデプロイされた場合にのみ発生します
- 負荷分散されたサーバーの 1 つで登録を完了すると、すべてが正常に機能します。これにより、負荷分散とサーバー セッションに問題があると思われます。NLB のサーバー ノードの 1 つから負荷分散された Web アプリケーションと対話する場合、すべての要求がその特定のサーバーに送信されることを知っています。
以前にも同様の問題に直面したことは知っていますが、数年前のことであり、解決策が何であったか思い出せません。
try
{
// get clean URL without query string parameters
string url;
if (string.IsNullOrEmpty(Request.Url.Query))
url = Request.Url.AbsoluteUri;
else
url = Request.Url.AbsoluteUri.Replace(Request.Url.Query, "");
// add encrypted serialized session object
url += "?" + Constants.QueryStringParameterData + "=" + SessionData.Serialize(true);
_log.Info("Redirecting to url '" + url + "'..");
Response.Redirect(url);
}
catch (Exception) { }