ASP.NET Core MVC缓慢的响应生成

时间:2018-07-22 11:20:17

标签: c# asp.net http web-applications asp.net-core-mvc

我有一个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);
    }

这是我检查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.

从您的控制器日志中可以看到:

...在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托管。

0 个答案:

没有答案