9

製品を .NET 4.5 にアップグレードした後、サイトで奇妙な動作が発生しています。できるだけ具体的にお伝えしたいと思いますが、漠然とした問題ですので、ご容赦ください。また、このシナリオでは、ベスト プラクティスに従っていないという前提で作業してください。

ユーザーは、Web サービスに対して多数の jquery ajax 呼び出しを非同期的に行うページにアクセスしています。このページのデザイン/コーディングが不十分なため、読み込みに時間がかかる場合がありますが、ユーザーがアクセスする必要があるサブメニューが提供されます。ページの読み込みが開始されると、メニュー オプションの 1 つをクリックして別のページに移動します。これまでのところ、特別なことは何もありません。

.NET 4.0 のみがインストールされたボックスで perfmon を使用すると、予想どおり、ASP.NET 要求が上下することがわかります。

4.0 ボックスの Perfmon

.NET 4.5 がインストールされているボックスにインストールすると、次のようになります。 ここに画像の説明を入力

上記のワークフローを実行した後、リクエストがハングアップします。キューに入れられていません。彼らはただそこに座っています。

さらに調査した結果、2 つの異なるページ間のクリックは単純な href ではなく、実際には Response.Redirect(url); を使用していることに気付きました。

また、これは IE を使用している場合にのみ発生します。Firefox と Chrome を使用している場合、これは問題ではありません。

これまでに試したことは次のとおりです。

  1. M$ に連絡し、DebugDiag ダンプを送信しました。まだ待っている。
  2. IIS にアクセスし、失敗した要求を追跡するようにサイトを設定し、失敗した要求フィルターを設定してすべてを取得しました。サイトがロックされたら、ログをクリアして、サイトがロックされた後に何が入ってくるかを調べます。AspNetSessionDataBegin と AspNetSessionDataEnd イベントの間でハングするたびに。
  3. セッションに対して読み取り/書き込みを行う HttpHandler があり、それを無効にするとほとんどの問題が解決するように見えますが、その理由についての説明はありません。
  4. jquery の onunload ハンドラーは、残りのすべての xmlhttp 要求をクリーンアップして中止する必要がありますが、常に実行されているわけではないようです。
  5. このパッチをインストールしましたが、まだ役に立ちませんでした。
  6. 現在、このナビゲーション ロジックの 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\"}");
        }
    }
}

次にどこを見るべきかについて何か提案はありますか?

4

1 に答える 1

4

次のパッチが Microsoft によってリリースされました。これは、web.config または IIS 構成の変更を必要とせずに問題を修正するようです。 http://support.microsoft.com/kb/2828841/en-us http://support.microsoft.com/kb/2828842/en-us

以前の回答

.NET互換性チームから提供されたさらなる調査と洞察/解決策の後、この回答を編集しています。

AJAX POST の ManagedPipelineHandler にある解決策は、呼び出しの進行中に IE9 ユーザーがページから移動した場合にクラッシュするため、より確実に機能しているように見えます。これは IE8-10 で発生した動作であり、9 だけではありません。

最初の答えが関係ない場合、人々を別の方向に向けることができることを願っているので、ここでは古い答えを保持します。

以前の回答者

ソースは最終的にセッションのロックになりました。AspNetSessionDataBegin および AspNetSessionDataEnd イベントは、完全に提供されるべきでした。これと同じ問題に遭遇した人は、いつ、どのようにセッションに書き込みを行っているかを確認してください。これらのリンクも役に立ちました。

ASP.Net のセッションを完全に置き換える

すべての ASP.Net Web サイトが遅い理由を発見したばかりで、どうすればよいかを考えています。

于 2013-03-11T16:30:08.737 に答える