Вызовы API с длинным запросом к БД, возвращающим время ожидания шлюза, несмотря на увеличение времени ожидания

Я использую Entity Framework 6 для доступа к SQL Server в приложении API. Сервер API и сервер БД разделены. У меня есть известный длинный запрос, выполнение которого занимает чуть больше минуты. Я установил CommandTimeout на моем EF DbContext, используя следующий код:

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

К сожалению, это, похоже, не оказывает какого-либо влияния, потому что время запроса истекает менее чем за минуту, и сервер возвращает ошибку 504 Gateway Timeout.

Почему это изменение не влияет на ограничение времени выполнения команды?

Есть ли что-то еще, что я должен сделать, чтобы этот запрос выполнялся дольше?

Еще несколько деталей:

Я написал настольное приложение, которое выполняет вызовы 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 был вызван тайм-аутом БД, но, скорее всего, он находится между настольным приложением и сервером API.

Несмотря на это, у меня заканчиваются идеи, поэтому все поможет.

1 ответ

Оказывается, был еще один тайм-аут, о котором я не думал. Поскольку я размещаю API и серверы баз данных в Amazon Web Services с помощью Elastic Beanstalk, между моим настольным приложением и сервером API был балансировщик нагрузки. Время ожидания по умолчанию составляет 60 секунд. Вот ссылка для увеличения настроек тайм-аута балансировщика нагрузки:

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

Другие вопросы по тегам