製品を .NET 4.5 にアップグレードした後、サイトで奇妙な動作が発生しています。できるだけ具体的にお伝えしたいと思いますが、漠然とした問題ですので、ご容赦ください。また、このシナリオでは、ベスト プラクティスに従っていないという前提で作業してください。
ユーザーは、Web サービスに対して多数の jquery ajax 呼び出しを非同期的に行うページにアクセスしています。このページのデザイン/コーディングが不十分なため、読み込みに時間がかかる場合がありますが、ユーザーがアクセスする必要があるサブメニューが提供されます。ページの読み込みが開始されると、メニュー オプションの 1 つをクリックして別のページに移動します。これまでのところ、特別なことは何もありません。
.NET 4.0 のみがインストールされたボックスで perfmon を使用すると、予想どおり、ASP.NET 要求が上下することがわかります。
.NET 4.5 がインストールされているボックスにインストールすると、次のようになります。
上記のワークフローを実行した後、リクエストがハングアップします。キューに入れられていません。彼らはただそこに座っています。
さらに調査した結果、2 つの異なるページ間のクリックは単純な href ではなく、実際には Response.Redirect(url); を使用していることに気付きました。
また、これは IE を使用している場合にのみ発生します。Firefox と Chrome を使用している場合、これは問題ではありません。
これまでに試したことは次のとおりです。
- M$ に連絡し、DebugDiag ダンプを送信しました。まだ待っている。
- IIS にアクセスし、失敗した要求を追跡するようにサイトを設定し、失敗した要求フィルターを設定してすべてを取得しました。サイトがロックされたら、ログをクリアして、サイトがロックされた後に何が入ってくるかを調べます。AspNetSessionDataBegin と AspNetSessionDataEnd イベントの間でハングするたびに。
- セッションに対して読み取り/書き込みを行う HttpHandler があり、それを無効にするとほとんどの問題が解決するように見えますが、その理由についての説明はありません。
- jquery の onunload ハンドラーは、残りのすべての xmlhttp 要求をクリーンアップして中止する必要がありますが、常に実行されているわけではないようです。
- このパッチをインストールしましたが、まだ役に立ちませんでした。
- 現在、このナビゲーション ロジックの Response.Redirect(url) メソッドを Response.Redirect(url, false); に変更しています。(上記を参照)。
また、リクエストに応じて、HttpHandler コードを次に示します。
public class KeepSessionAliveHttpHandler : IHttpHandler, IRequiresSessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (context.Session.IsNewSession)
{
string redirectUrl = context.Request.Url.AbsoluteUri.Replace(context.Request.Url.AbsolutePath, VirtualPathUtility.ToAbsolute(Constant.Page_Logout));
context.Response.Clear();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Flush();
context.Response.Write("{\"IsSessionAlive\": \"false\", \"RedirectUrl\": \"" + redirectUrl + "\"}");
}
else
{
context.Session["KeepSessionAlive"] = TimeZoneHelper.GetCurrentUtcDateTime();
context.Response.Clear();
context.Response.ContentType = "application/json; charset=utf-8";
context.Response.Flush();
context.Response.Write("{\"IsSessionAlive\": \"true\"}");
}
}
}
次にどこを見るべきかについて何か提案はありますか?