我在我的应用程序中观察到一个非常奇怪的行为。
请看看这个:
给定的页面通过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