使用长数据库查询的API调用尽管延长了超时,但仍返回Gateway Timeout

时间:2016-03-09 19:30:58

标签: c# entity-framework api server command-timeout

我正在使用Entity Framework 6访问API应用程序中的SQL Server。 API服务器和数据库服务器是分开的。我有一个已知的长查询,运行时间超过一分钟。我使用以下代码在我的EF DbContext上设置了CommandTimeout:

db.Database.CommandTimeout = 20 * 60;  // 20 minutes

不幸的是,这似乎没有任何影响,因为查询在不到一分钟的时间内仍然超时,服务器返回504网关超时错误。

为什么此更改对命令执行时间限制没有任何影响?

我还应该做些什么来让这个查询运行更久?

更多细节:

我编写了一个桌面应用程序,它对API服务器进行API调用,后者又向数据库服务器发出查询。在桌面应用程序端,我设置了HttpClient属性:

httpClient = new HttpClient { Timeout = new TimeSpan( 0, 20, 0 ) };

在API服务器端,我已设置执行超时:

<system.web>
    <httpRuntime requestPathInvalidCharacters="" maxRequestLength="2097151" executionTimeout="30000" />
</system.web>

在API服务器上,我按上述方式设置了SQL命令超时。

在某些时候,响应总是在不到一分钟后结束,尽管事实上我已将所有超时设置为20分钟。我假设504是由db超时引起的,但我想它与桌面应用程序和API服务器之间的可能性差不多。

无论如何,我的想法已经用完,所以任何事情都会有所帮助。

1 个答案:

答案 0 :(得分:2)

原来还有一个我没想过的超时设置。因为我使用Elastic Beanstalk在Amazon Web Services上托管API和数据库服务器,所以桌面应用程序和API服务器之间有一个Load Balancer。默认超时为60秒。以下是增加Load Balancer超时设置的链接:

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html