2017-01-12 51 views
1

我在我的應用程序中觀察到一個非常奇怪的行爲。
請看看這個:
enter image description here
給定的頁面通過ajax達到5個API操作。奇怪的是,當同時執行時,響應時間的總和比順序響應時間慢10-100倍。
我在我的應用程序中有兩種類型的遙測日誌。一個是MS本身提供的應用程序見解,以及一個基本的HttpModule,它處理BeginRequestEndRequest事件記錄所花費的時間。
事情是從這兩個和小提琴手的信息是不一致的。 httpModule日誌匹配的提琴手錶示總是,但應用程序見解只有匹配順序發出請求時。
我從應用程序洞察中獲得的數據使我相信請求始終是順序的。我找到了可能性和解釋,我已經消除了數據庫事務相關的問題(因爲這些是讀取操作,死鎖沒有發生),代碼鎖定(無鎖發生)等等,因爲直到「return Json(something); 「行爲是100%一致的。現在,我只有1個地方看:finally區塊與EndRequest事件的處理之間的地方。「return Json(myObject);」後會發生什麼?

那麼,那裏會發生什麼?造成這種「滯後」的原因是什麼?!?

額外的信息:
的應用洞察日誌是這樣的:

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每個請求鎖定該請求的會話對象。換句話說,對於正在處理的特定會話總是隻有一個請求,而其他人正在排隊。

有一種解決方法 - 你必須指定具體的請求可以是服務器,而無需訪問會話(或只讀訪問)。在ASP.NET MVC的情況下,你可以做到這一點通過使用SessionStateAttributeReadOnlyDisable值在你的控制器

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

如果您需要會話寫訪問有沒有辦法解決這個。

+0

按會話你的意思是HTTPContext.Session的權利? – Leonardo

+0

@Leonardo正好 – tpeczek

+0

我實施了ReadOnly替代方案,現在事情真的很甜蜜!很多! – Leonardo