异步处理对ASPNET Core API的请求

时间:2019-07-18 14:50:51

标签: c# asp.net asp.net-mvc asynchronous .net-core

我正在将旧的.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

0 个答案:

没有答案