C# 从ASP.NET迁移到.NET Core,我的API现在非常慢。我能做些什么来诊断?

C# 从ASP.NET迁移到.NET Core,我的API现在非常慢。我能做些什么来诊断?,c#,asp.net,asp.net-core,asp.net-apicontroller,C#,Asp.net,Asp.net Core,Asp.net Apicontroller,我刚刚将一个非常旧的API(开发始于21世纪初)迁移到.NETCore。我在这个环境中不是特别舒服,但我设法让它正常工作,而且似乎更容易做一些简单的事情,如设置CORS/Http谓词路由等。我唯一的问题是,请求有时需要很长时间才能完成。(例如50秒)而在这之前它会很快 我正试图找出问题所在,因为它不会每次都发生在同一个请求上,有时它工作得非常好。有人对我如何诊断阻碍API响应的原因有什么建议吗 以下是请求的日志: Microsoft.AspNetCore.Hosting.Internal.Web

我刚刚将一个非常旧的API(开发始于21世纪初)迁移到.NETCore。我在这个环境中不是特别舒服,但我设法让它正常工作,而且似乎更容易做一些简单的事情,如设置CORS/Http谓词路由等。我唯一的问题是,请求有时需要很长时间才能完成。(例如50秒)而在这之前它会很快

我正试图找出问题所在,因为它不会每次都发生在同一个请求上,有时它工作得非常好。有人对我如何诊断阻碍API响应的原因有什么建议吗

以下是请求的日志:

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/1.1 POST http://localhost:44374/APIAllitem/Getitems/48/9766696088310E6D3C15227DE232D2?ckey=1575572795915 application/json 368
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route matched with {action = "Getitems", controller = "APIAllitem"}. Executing action MyProject.Controllers.APIAllitemController.Getitems (MyProject)
// Log pauses here for the long 'wait'
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executing action method MyProject.Controllers.APIAllitemController.Getitems (MyProject) with arguments (48, 9766696088310E6D3C15227DE232D2, MyProject.Controllers.APIAllitemController+GetitemsParams) - Validation state: Valid
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action method MyProject.Controllers.APIAllitemController.Getitems (MyProject), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 448.3576ms.
Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor:Information: Executing ObjectResult, writing value of type 'Microsoft.AspNetCore.Mvc.ObjectResult'.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action MyProject.Controllers.APIAllitemController.Getitems (MyProject) in 26134.6832ms
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 26143.0763ms 200 application/json; charset=utf-8
您可以看到,这个特定的请求需要26秒才能完成

这就是控制器操作当前的样子:

// Just for passing body params into the action
public class GetTypesParams {
  public string field;
  public string order;
  public int page;
  public int max;
}

[HttpPost("{id}/{key}")] // <- Matches route APILogTypeListController/GetTypes/{id}/{key}
public IActionResult GetTypes(int id, string key, [FromBody]GetTypesParams bodyParams)
{
    //Controller Logic ......... 
    return StatusCode(200, myResponseJSON);
}
我不知道这是否与:

  • 新的Kestrel服务器
  • 属性路由
  • 新的ObjectResult
  • Net内核在某种程度上影响了控制器与数据库的交互,延迟实际上发生在调用控制器方法之前,所以这不是延迟

如果有人能告诉我应用程序的哪些部分可能导致问题,以及我如何能够进一步调试/研究它,我将不胜感激。现在,我将开始一次运行控制器操作1,并查看更改请求中的任何内容是否会影响任何内容

你需要看看你是否能让它重现——或者只是记录下在你找到一个显示症状的请求之前需要多长时间。配置它。准确地找出每一点需要多长时间。这可能意味着您需要记录数据和/或查看分析工具。我们真的帮不了你更多。这取决于您调查并缩小问题的范围。如果您使用Visual Studio进行开发,则有很多选项,包括应用程序洞察。您请求帮助诊断问题,但您已经编辑了导致问题的所有内容,即
//控制器逻辑…
。因此,不可能帮助你。有趣的是,这场争论是从何而来的?9766696088310E6D3C15227DE232D2在这些日志条目之间是控制器创建和DI、模型绑定、模型验证。。。如果您的模型很复杂,并且可能包含循环引用,那么验证可能需要很长(但不是无限)时间。
public void GetTypes(int id, string key, [FromBody]string field, [FromBody]string order, [FromBody]int page, [FromBody]int max)
{
    //Controller Logic ......... 
    response.Clear();
    response.BufferOutput = false;
    response.StatusCode = 200;
    response.Write(myResponseJSON);
    response.End();
}