Как избежать ошибки тайм-аута SqlClient во время выполнения функции C # Azure?

Я создал триггер времени приложения-функции с помощью C #. Внутри логики я вызываю и выполняю хранимую процедуру, созданную мной в SQL Server.

Выполнение сохраненной процедуры занимает более 8 минут, и в журнале приложений функций Azure у меня есть следующая ошибка:

2018-04-02T11: 03: 46.409 [Ошибка] Исключение при выполнении функции: Functions.AbarIomWeeklyUsage. mscorlib: исключение было выброшено целью вызова. .Net Поставщик данных SqlClient: истекло время ожидания выполнения. Время ожидания истекло до завершения операции или сервер не отвечает. Время ожидания операции истекло. 2018-04-02T11: 03: 46.425 [Ошибка] Функция завершена (сбой, Id = 1b85e7ef-ea52-4fd3-ab79-f27d188c5cac, продолжительность = 30323 мс)

Пока я пробовал 2 вещи: 1. использовать тайм-аут соединения в строке подключения приложения 2. добавить тайм-аут в host.json

Но он по-прежнему дает мне ту же ошибку 30 секунд тайм-аута.

Кто-нибудь испытал то же самое или есть решение для этого?


person Terry Yulianto    schedule 02.04.2018    source источник
comment
Вы получаете тайм-аут sql через 30 секунд или тайм-аут функции через 8 минут?   -  person Mikhail Shilkov    schedule 02.04.2018
comment
Сообщение об исключении выглядит так, как будто это проблема тайм-аута хранимой процедуры, а не время выполнения функций. На что вы установили тайм-аут времени выполнения ваших функций?   -  person Connor McMahon    schedule 02.04.2018
comment
Я думаю, что это сообщение касается тайм-аута sql после 30 секунд, но не могу найти, где изменить тайм-аут conn. время ожидания моей функции 10 минут {functionTimeout: 00:10:00}   -  person Terry Yulianto    schedule 03.04.2018
comment
Я добавил commandtimeout, когда sqlcommand, давайте посмотрим, как это работает. NB: этот код строки исправит это для меня, спасибо за помощь и внимание   -  person Terry Yulianto    schedule 03.04.2018


Ответы (2)


Вы определенно превышаете время ожидания команды по умолчанию (по умолчанию 30 секунд). Если вы не установите SqlCommand.CommandTimeout вы получите исключение SqlException. Задайте CommandTimeout команды в коде (для этого нет конфигурации) равным 10 минутам (600 секундам), так же, как тайм-аут вашей функции.

person codekaizen    schedule 03.04.2018

Вот фрагмент кода, как это сделать:

using (SqlCommand cmd = new SqlCommand(text, conn))
{
        cmd.CommandTimeout = 60 * 60; // seconds
        cmd.Parameters.AddWithValue("@parameter1", myparameter1);

        // Execute the command and log the # rows affected.
        var rows = await cmd.ExecuteNonQueryAsync();

        log.Info($"{rows} rows were deleted");
}
person jchang1    schedule 05.04.2018