c# - ASP.NET Core MVC 慢响应生成
问题描述
我有一个 ASP.NET Core MVC Web 应用程序,它有一个以 json 形式返回一些数据的端点。唯一的问题是我的数据大约是 5 MB 的原始(未识别)JSON,并且响应需要很长时间。
我设置了一些指标,发现平均而言,我的应用程序所做的处理大约需要 30 毫秒。然而整个响应在超过 250ms后返回。
我正在使用在我的机器上运行的应用程序的本地实例进行测试,并使用邮递员发送获取请求,因此网络延迟最小。
这是我的控制器的样子
[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);
}
这是我在检查 AspNetCore 日志时发现的。
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.
正如您从我的控制器的日志中看到的那样:
...返回结果 Microsoft.AspNetCore.Mvc.OkObjectResult in 31.4532ms。
这与我的秒表指标相匹配,并且是应用程序实际执行我的代码的时间量。
从那里开始,ASP 接管了另外两点:
在 69.2546 毫秒内执行动作 DemoApp.Controllers.StatusController.GetData (DemoApp)
请求在 175.2726 毫秒内完成 200 文本/纯文本;字符集=utf-8
所以我的问题是,在 ASP 得到我传递给的结果之后,我如何才能找出这两个时间点发生的事情,this.Ok()
这需要花费这么多时间(并修复它)
同样,我返回的响应非常大(对于此示例,为 1.2MB 原始 JSON)。但我不明白是什么导致了如此长的延迟(鉴于我所做的序列化只需要 10 毫秒)
我正在使用 ASP.NET Core MVC 并以 .NET Core 2.1 为目标。该应用程序由 Kestrel 托管。
解决方案
推荐阅读
- azure - 将字符串与 DateTimeOffset 用于日期值时的 Azure 搜索性能
- leaflet - 在传单 js 的搜索框中选择地址后获取地址详细信息
- python - 是否有匹配列表、字典和集合但不匹配字符串的 Python 类型签名?
- javascript - dataTables copy to clipboard interference
- amazon-web-services - AWS Glue 挂起并在 ETL 作业中花费大量时间
- python - 字典理解中是否允许使用 lambda?
- wix - 如何在 Wix 工具集中识别当前登录用户?
- python - python中xy数据的等高线图
- python - Python3.6 无法安装最新版本的 yoyo-migrations
- sql - 具有多个连接的 Doctrine 2 查询