2017-01-12 10 views
1

私のアプリケーションでは非常に奇妙な動作が見られます。
plsこれを見てください:
enter image description here
特定のページがajax経由で5つのAPI操作に到達します。奇妙なことは、同時に実行すると同時に実行すると、応答時間の合計が逐次的なものよりも10〜100倍遅いことです。
私のアプリケーションには2種類の遠隔測定ログがあります。 1つは、MS自身によって提供されるアプリケーションの洞察、およびBeginRequestEndRequestイベントを処理する初歩的なHttpModuleです。
物事は、両方とフィドラーからの情報が一貫していないということです。 httpModuleログは、は常にと一致しますが、要求が順次発行されるときにはアプリケーションの洞察のみが一致します()。
私がアプリケーションの洞察力から得たデータは、要求が常に逐次的であると信じています。「return Json(myObject);」の後にはどうなりますか?

データベーストランザクション関連の問題(読み取り操作、デッドロックが発生していないため)、コードロック(ロックが発生しない)などがありました。 "その動作は100%一貫しています。今、私は見て1つだけの場所:finallyブロックとEndRequestイベントの処理の間の場所があります。

だから、どうなりますか?この「遅れ」の原因は何か?

追加情報:
アプリケーション洞察ロギングはこのようなものです:

public JsonResult DoSomething(int id) 
    { 
     #region Trace 
     Stopwatch st = Stopwatch.StartNew(); 
     RequestTelemetry reqTel = new RequestTelemetry(); 
     TraceTelemetry traceTelemetry = new TraceTelemetry(); 
     traceTelemetry.Message = "Doing Somthing"; 
     traceTelemetry.SeverityLevel = SeverityLevel.Verbose; 
     _logger.TrackTrace(traceTelemetry); 
     #endregion 
     try 
     { 
      var something = Work(); 
      #region Trace 
      traceTelemetry = new TraceTelemetry(); 
      traceTelemetry.Message = "Returning Work"; 
      traceTelemetry.SeverityLevel = SeverityLevel.Verbose; 
      _logger.TrackTrace(traceTelemetry); 
      #endregion 
      return Json(something); 
     } 
     catch 
     { 
      return Json(0); 
     } 
     finally 
     { 
      #region Trace 
      st.Stop(); 
      reqTel.Duration = st.Elapsed; 
      reqTel.Name = "DoSomething"; 
      reqTel.Url = HttpContext.Request.Url; 
      reqTel.Properties.Add("Message", "Finally Block for DoSomething"); 
      reqTel.Properties.Add("TimeStamp", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")); 
      _logger.TrackRequest(reqTel); 
      #endregion 
     } 
    } 

答えて

1

あなたの観察が正しいこと、その理由は、ASP.NETでのすべての要求は、要求のためのセッションオブジェクトをロックしていることです。言い換えると、特定のセッションが処理され、他のセッションがキューに入れられているという要求は常に1つだけです。

これを回避する方法があります。特定のリクエストをセッションにアクセスできないサーバー(または読み取り専用アクセス)にする必要があることを指定する必要があります。 ASP.NET MVCの場合は、あなたがセッションへの書き込みアクセスが必要な場合は、あなたのコントローラ

[SessionState(SessionStateBehavior.Disabled)] 
public class SomeController: Controller 
{ 
    ... 
} 

ReadOnlyまたはDisableの値を持つSessionStateAttributeを使用して、この周りに方法がないことを行うことができます。

+0

セッションでは、HTTPContext.Session権限を意味しますか? – Leonardo

+0

@レオナルド正確に – tpeczek

+0

私はReadOnlyの代替案を実装しました。たくさん! – Leonardo

関連する問題