Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “之后会发生什么?”;返回Json(myObject)&引用;?_C#_Asp.net - Fatal编程技术网

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确切地说,我实现了只读替代方案,现在一切都很好!太多了!