dotnet 核心 3.1 中的 504 网关超时

时间:2020-12-31 04:28:55

标签: c# .net-core entity-framework-core .net-core-3.1 amazon-lightsail

我使用 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

应用程序池设置截图

enter image description here

我们是否遗漏了什么?

1 个答案:

答案 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 上调用它

enter image description here

然后您可以逐渐增加超时时间。这有助于您识别阈值并证明它与您的应用程序代码无关(因为控制器除了等待之外什么都不做)。