首页 > 解决方案 > 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 托管。

标签: c#asp.nethttpweb-applicationsasp.net-core-mvc

解决方案


推荐阅读