我正在将旧的.net框架API升级到aspnet核心Web API。 API接收Get和Post请求,进行一些计算并访问数据库,然后返回Json字符串。
我已经将代码的所有较低级别的功能都转换为.net核心,但是当进行一些负载测试时,新代码比旧的实现要慢得多。我怀疑这是由于使用Unity容器异步运行线程的旧代码的最高级别。
我的项目使用的是.NET core 2.2,并且到目前为止,它是由kestrel托管在我的计算机上本地运行的。
我已经研究了C#中的许多异步实践,例如使用任务和await / async关键字。我可能没有正确使用这些。据我了解,await用于存在不需要立即返回某个函数的同步任务,但在我的代码中似乎没有用例。
基本上,我相信我自己的API调用响应速度很快,但是代码阻止了多个API调用同时运行。我通过使API立即返回一个空的json字符串证明了这一点,并且响应仍然比进行数据库访问的旧代码慢很多。
我也尝试过修改Program.cs中的configureKestrel选项,并在Startup.cs中将类初始化为单例,但是它对吞吐量没有任何影响。
控制器:
public class ExecuteController : Controller
{
private readonly var vars;
public ExecuteController(var vars)
{
//Dependency Injection constructor
}
[HttpPost]
[Route("route")]
public Result Execute([FromBody] ExecuteParams parameters)
{
ExecuteJobResult res = vars.ExecuteJob(parameters);
return new Result { answer = res };
}
同样,各个ExecuteJob的实际功能无关紧要,因为在方法开始时返回空字符串时,它仍然很慢。我需要找到一种方法,使对该方法的所有API调用都同时发生,而不是排队。
使用仅返回空字符串的代码链接到存储库: Repo 您需要安装dotnet才能运行它
如下所示,在运行空字符串加特林(负载)测试时,我得到如下信息: Slow Code
这是旧代码的样子,正如您所看到的,随着时间的流逝,响应是平稳的,并且确实下降到了0 Fast Code