我使用 dotnetcore 3.1
版本创建了一个 React 项目。这托管在 AWS Lightsail
上的 IIS 服务器上。我们使用 AWS Lightsail Loadbalancers
。 Web 服务使用 Entity Framework Core 与 Microsoft SQL Server Express (64-bit) Database
版本 14.0.3281.6
通信。
我们面临的问题是:
我们通过 POST
请求调用网络服务。这将在数据库上运行查询。此查询使用 Include()
对于大数据,我们注意到网络服务返回一个 504 Gateway Timeout
。
我们尝试将 CommandTimeout
设置为 900 秒,如下所示
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var connectionString = configuration.GetConnectionString("DefaultConnection");
optionsBuilder.UseSqlServer(connectionString, sqlServerOptions => sqlServerOptions.CommandTimeout(900));
}
}
我们的连接字符串
"DefaultConnection": "Data Source=server_name_here,port_number_here;Initial Catalog=db_name_here;Integrated Security=False;Persist Security Info=False;User ID=user_name_here;Password=password_here
我们尝试过的其他事情:
在 requestTimeout="00:20:00"
web.config
应用程序池设置截图
我们是否遗漏了什么?
答案 0 :(得分:0)
我怀疑这与 AWS 负载均衡器配置有关。 504 网关超时可能来自负载均衡器,因为它希望您的应用程序在一定时间内做出响应(对于大数据则不然)。
您可以尝试(暂时)禁用负载均衡器,看看您是否仍然遇到 504 网关超时错误。
您还可以添加一个新控制器来测试此问题:
[ApiController]
[Route("[controller]")]
public class TimeoutController : ControllerBase
{
[HttpGet]
public IActionResult Get(int timeoutInSeconds)
{
Thread.Sleep(TimeSpan.FromSeconds(timeoutInSeconds));
return Ok($"Waited for {timeoutInSeconds} seconds.");
}
}
然后你可以用你的浏览器在 http://[server:port]/timeout?timeoutInSeconds=10 上调用它
然后您可以逐渐增加超时时间。这有助于您识别阈值并证明它与您的应用程序代码无关(因为控制器除了等待之外什么都不做)。