C# “之后会发生什么?”;返回Json(myObject)&引用;?
我在应用程序中观察到一个非常奇怪的行为。C# “之后会发生什么?”;返回Json(myObject)&引用;?,c#,asp.net,C#,Asp.net,我在应用程序中观察到一个非常奇怪的行为。 请看这个: 一个给定的页面可以通过ajax实现5个API操作。奇怪的是,当以并发方式同时执行时,响应时间之和比顺序执行慢10-100倍左右。 在我的应用程序中,我有两种类型的遥测日志。一个是MS本身提供的应用程序洞察,一个基本的HTTPM模块,用于处理BeginRequest和EndRequest事件,记录所用时间。 问题是,来自和fiddler的信息并不一致。httpModule日志始终与fiddler表示相匹配,但只有在按顺序发出请求时,应用程序细
请看这个:
一个给定的页面可以通过ajax实现5个API操作。奇怪的是,当以并发方式同时执行时,响应时间之和比顺序执行慢10-100倍左右。
在我的应用程序中,我有两种类型的遥测日志。一个是MS本身提供的应用程序洞察,一个基本的HTTPM模块,用于处理
BeginRequest
和EndRequest
事件,记录所用时间。问题是,来自和fiddler的信息并不一致。httpModule日志始终与fiddler表示相匹配,但只有在按顺序发出请求时,应用程序细节才会匹配。
我从application insights获得的数据使我相信请求总是顺序的 为了寻找可能性和解释,我消除了与数据库事务相关的问题(因为这些是读取操作,不会发生死锁)、代码锁定(不会发生锁)和其他问题,因为在“返回Json(something);”之前,行为是100%一致的。现在,我只有一个地方可以看:
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
}
}
您的观察是正确的,原因是ASP.NET中的每个请求都会锁定该请求的会话对象。换句话说,对于正在处理的特定会话,始终只有一个请求,而其他请求正在排队 有一种方法可以解决这个问题——您必须指定特定的请求可以是不访问会话(或只读访问)的服务器。对于ASP.NET MVC,您可以通过在控制器上使用值为
ReadOnly
或Disable
的SessionStateAttribute
来实现这一点
[SessionState(SessionStateBehavior.Disabled)]
public class SomeController: Controller
{
...
}
如果您需要对会话进行写访问,则无法解决此问题。@Leonardo确切地说,我实现了只读替代方案,现在一切都很好!太多了!