Время ожидания истекло на этапе после входа в систему

У меня есть служба приложений в Azure, подключенная к базе данных SQL Server в Azure. Служба приложений имеет несколько запускаемых по таймеру веб-заданий, которые взаимодействуют с базой данных.

Я получаю следующее исключение каждый раз, когда выполняется запрос SQL, и ни один из существующих советов мне не помог:

Microsoft.Data.SqlClient.SqlException (0x80131904): истекло время ожидания подключения. Время ожидания истекло на этапе после входа в систему. Соединение могло быть прервано во время ожидания завершения процесса входа в систему и ответа сервера; Или время ожидания истекло при попытке создать несколько активных подключений. Продолжительность попытки подключения к этому серверу составила - [Pre-Login] initialization=124; рукопожатие=49; [Вход] инициализация=0; аутентификация=0; [После входа] завершено=14011;

Уровень службы приложений — S1, и для него включена функция Always On. Уровень SQL — «Общее назначение — без сервера: стандартная серия (Gen5), 1 виртуальное ядро».

Ошибка возникает каждый раз, независимо от данных. Вчера это произошло на данных размером 5 записей. Согласно App Insights, запрос SQL Server занял 14 секунд, прежде чем появилась эта ошибка.

Ошибка никогда не возникает, когда я запускаю приложение локально на своем ПК, используя ту же базу данных Azure. Таким образом, он без особых усилий обработал десятки тысяч записей, поэтому я не думаю, что это проблема конфигурации базы данных.

Насколько я понимаю, у меня есть какая-то проблема с управлением временем жизни соединения в моем приложении, поскольку оно работает локально, когда веб-задание выполняется немедленно, но падает в Azure, когда с момента запуска проходит полдня. Я использую EF Core, я зарегистрировал контекст приложения следующим образом:

collection
        .AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                context.Configuration.GetConnectionString("Database"),
                sqlServerOptions =>
                {
                    sqlServerOptions.CommandTimeout(3600);
                    sqlServerOptions.EnableRetryOnFailure(5, TimeSpan.FromSeconds(30), null);
                }))

... и все сервисы, использующие контекст БД, регистрируются как "ограниченные".

Также может быть проблема с брандмауэром SQL Server, но у него включен параметр «Разрешить службам и ресурсам Azure доступ к этому серверу».

Возможно, это не постоянное решение, но добавьте Trust Server Certificate=True; в качестве атрибута строки подключения (хотя, признаюсь, я не знаю, как, черт возьми, вы это делаете в путанице, известной как EF Core). Я только что наткнулся на это вчера, и это может задержать вас, пока вы не научитесь делать правильные вещи CA/cert.

Aaron Bertrand 18.04.2023 14:56

Вы проверили данные аутентификации во (всех) строках подключения? Сообщение об ошибке предполагает, что у вас могут быть включены Integrated Security или Trusted_Connection (например, аутентификация Windows/Active Directory).

AlwaysLearning 18.04.2023 16:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

запрос SQL Server занял 14 секунд, прежде чем получить эту ошибку.

ConnectionTimeout по умолчанию составляет 15 секунд. А бессерверная база данных, которая была приостановлена, обычно требует больше времени, чтобы возобновить ее работу.

Если бессерверная база данных приостановлена, возобновится первый вход в систему. базу данных и вернуть ошибку о том, что база данных недоступен с кодом ошибки 40613. После возобновления работы базы данных необходимо повторить попытку входа в систему, чтобы установить соединение. Клиенты базы данных с логика повторной попытки подключения не должна изменяться. Для подключения параметры логики повторных попыток, встроенные в драйвер SqlClient, см. настраиваемая логика повтора в SqlClient.

Уровень бессерверных вычислений — подключение

Я попробую добавить Connect Timeout=60 в строку подключения. Спасибо!

Flatternschu 19.04.2023 22:52

Как говорится в документе, вам может потребоваться повторить попытку даже при более длительном тайм-ауте соединения.

David Browne - Microsoft 21.04.2023 00:34

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