我有一个ASP.NET Core MVC Web应用程序,该应用程序的端点返回一些数据作为json。唯一的问题是我的数据大约有5 MB的原始(未识别)JSON,并且响应时间非常长。
我设置了一些指标,发现平均而言,我的应用程序执行的处理需要大约30ms 。但是,整个响应会在超过250毫秒后返回。
我正在使用在计算机上运行的应用程序的本地实例进行测试,并与邮递员发送获取请求,因此网络延迟最小。
[HttpGet("getData")]
public IActionResult GetData()
{
Stopwatch sw = Stopwatch.StartNew();
long a, b, c;
var data = this._cacheInternal.GetValidDataSet();
a = sw.ElapsedMilliseconds;
sw.Restart();
var processedData = this.ProcessData(data, false);
b = sw.ElapsedMilliseconds;
sw.Restart();
var serialized = JsonConvert.SerializeObject(processedData);
c = sw.ElapsedMilliseconds;
this._log.Info($"Data: {a} ms. Processing {b} ms. Serialization {c} ms.");
return this.Ok(serialized);
}
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:5000/api/status/getData
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Route matched with {action = "GetData", controller = "Status"}. Executing action DemoApp.Controllers.StatusController.GetData (DemoApp)
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Executing action method DemoApp.Controllers.StatusController.GetData (DemoApp) - Validation state: Valid
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action method DemoApp.Controllers.StatusController.GetData (DemoApp), returned result Microsoft.AspNetCore.Mvc.OkObjectResult in 31.4532ms.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
Executing ObjectResult, writing value of type 'System.String'.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action DemoApp.Controllers.StatusController.GetData (DemoApp) in 69.2546ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 175.2726ms 200 text/plain; charset=utf-8
此请求的秒表记录如下:
Data: 1 ms. Processing 19 ms. Serialization 10 ms.
从您的控制器日志中可以看到:
...在31.4532毫秒内返回结果Microsoft.AspNetCore.Mvc.OkObjectResult 。
这与我的秒表指标匹配,是应用程序实际执行我的代码的时间。
从那以后,ASP可以接管另外两个方面:
在69.2546毫秒内执行了动作DemoApp.Controllers.StatusController.GetData(DemoApp)
请求在175.2726毫秒内完成200个文本/纯文本; charset = utf-8
所以我的问题是,如何找出ASP获得我传递给this.Ok()
的结果所花的时间很长的那两个时间点(并修复它)
同样,我返回的响应非常大(例如1.2MB原始JSON)。但是我不明白是什么原因造成了如此长的延迟(考虑到我所做的序列化只需要10毫秒)
我正在使用ASP.NET Core MVC,并以.NET Core 2.1为目标。该应用程序由Kestrel托管。