C# ASP.NET Core:两次调用之间的空闲超时(有延迟)

C# ASP.NET Core:两次调用之间的空闲超时(有延迟),c#,sql-server,asp.net-mvc,asp.net-core,kestrel,C#,Sql Server,Asp.net Mvc,Asp.net Core,Kestrel,我有一个ASP.NET核心Web API在Kestrel(Ubuntu)下运行,我面临一个奇怪的情况: 当我运行前20个API调用时,前3-5个调用非常慢,然后响应时间就可以了。 然后我做了一个很短的延迟(可能是一分钟甚至更少),然后再次运行一系列API调用,并且前几次调用非常慢,只有在前3-5次调用之后,响应时间才变得正常 起初,我认为问题出在红隼的配置上,所以我做了以下设置: var host = new WebHostBuilder() .UseKestrel(opt

我有一个ASP.NET核心Web API在Kestrel(Ubuntu)下运行,我面临一个奇怪的情况: 当我运行前20个API调用时,前3-5个调用非常慢,然后响应时间就可以了。 然后我做了一个很短的延迟(可能是一分钟甚至更少),然后再次运行一系列API调用,并且前几次调用非常慢,只有在前3-5次调用之后,响应时间才变得正常

起初,我认为问题出在红隼的配置上,所以我做了以下设置:

   var host = new WebHostBuilder()
        .UseKestrel(options =>
        {
            options.Limits.MaxConcurrentConnections = 200;
            options.Limits.MaxConcurrentUpgradedConnections = 200;
            options.Limits.MaxRequestBodySize = 10000;
            options.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
            options.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100, gracePeriod: TimeSpan.FromSeconds(10)));
            options.Limits.KeepAliveTimeout = TimeSpan.FromDays(2);
        })
        .UseConfiguration(config)
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    host.Run();
}
var host=new WebHostBuilder()
.UseKestrel(选项=>
{
options.Limits.MaxConcurrentConnections=200;
options.Limits.MaxConcurrentUpgradedConnections=200;
options.Limits.MaxRequestBodySize=10000;
options.Limits.MinRequestBodyDataRate=新的MindDataRate(bytesPerSecond:100,gracePeriod:TimeSpan.FromSeconds(10));
options.Limits.MinResponseDataRate=新的MinDataRate(bytesPerSecond:100,gracePeriod:TimeSpan.FromSeconds(10));
options.Limits.KeepAliveTimeout=TimeSpan.FromDays(2);
})
.UseConfiguration(配置)
.UseContentRoot(目录.GetCurrentDirectory())
.Useii整合()
.UseStartup()
.Build();
host.Run();
}
它帮助我使我的服务更快地工作,但这个问题仍然存在

服务的基本逻辑如下所示: 1) 获取请求对象 2) 将其解析为POCO类的实例 3) 使用multiple select调用数据库以获取所有必需的数据(为此,我使用Dapper和允许一次性运行多个SQL查询的方法) 4) 使用新接收的数据更新对象的实例,并将对象插入数据库

就这样

我不知道是什么原因造成了这种延迟(空闲时间)

我猜也许我应该有一些假调用来保持服务运行。因此,我添加了一个包含计时器作业的单例,以每分钟查询数据库中的一些查找数据。但它没有帮助

然后,我尝试添加另一个计时器作业来查询步骤N3中仅针对数据库中的第一条记录所需的数据,没有一些特定的req参数,而且没有任何帮助,而且,它开始工作得更慢

我还添加了表上的索引,以使选择更快地工作,此外,我还向所有选择添加了(NOLOCK)语句,但没有帮助


有什么想法吗,伙计们?

我也在想可能是关于连接字符串的,这里是:


数据源=mydbserver;初始目录=db1;持久安全信息=True;用户ID=大男孩;密码=大男孩;multipleactiveresultsets=True;最大池大小=200;池=真;连接超时=30;连接寿命=0;最小池大小=0

当查询执行getting time而不是desire时,则抛出超时异常。我们可以通过设置commandtimeout=0来解决此问题。当我们设置commandtimeout=0时,它将在完成执行后响应

可能它与SQL Max Pool Size(在连接字符串中)连接?SQL Server将其读取的数据页缓存到内存中(您可以通过
设置统计IO ON
看到),这可能涉及到这一点。如果您能提供一个连接字符串,那将非常棒。我也有同样的问题。我不知道原因,但经过一段空闲时间后,请求速度变慢,下一个请求速度变快。并且该服务始终处于打开状态,并且没有数据库连接。看起来红隼是如何在内部实现的。它是在查询时设置的,而不是在建立连接时设置的。您需要在每个数据库响应中关闭连接。是的,我在进行查询之前在命令中设置了连接,是的,我在每次与数据库对话后关闭连接