我在我的應用程序中觀察到一個非常奇怪的行爲。
請看看這個:
給定的頁面通過ajax達到5個API操作。奇怪的是,當同時執行時,響應時間的總和比順序響應時間慢10-100倍。
我在我的應用程序中有兩種類型的遙測日誌。一個是MS本身提供的應用程序見解,以及一個基本的HttpModule,它處理BeginRequest
和EndRequest
事件記錄所花費的時間。
事情是從這兩個和小提琴手的信息是不一致的。 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
}
}
按會話你的意思是HTTPContext.Session的權利? – Leonardo
@Leonardo正好 – tpeczek
我實施了ReadOnly替代方案,現在事情真的很甜蜜!很多! – Leonardo