2017-01-12 50 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