Моей функции Azure периодически не удается прочитать строку подключения

#azure #azure-functions #azure-functions-runtime

#azure #azure-функции #azure-функции-среда выполнения

Вопрос:

У меня есть функция Azure, которая запускается из триггера очереди. В репозитории есть метод для извлечения строки подключения из коллекции ConnectionStrings.

 return System.Configuration.ConfigurationManager.ConnectionStrings["MyDataBase"].ToString();
  

По большей части это отлично работает, но я периодически вижу, что это возвращает ошибку исключения null.
Есть ли способ, которым я могу сделать это более надежным?
Функции Azure иногда не могут получить настройки?
Должен ли я сохранить параметр в другом разделе?
Я также хочу сказать, что это выполняется тысячи раз в день, но я вижу это всплывающее окно примерно 100 раз.
Версия среды выполнения: 1.0.12299.0

Ответ №1:

Вы читаете конфигурацию для каждого вызова функции? Вам следует рассмотреть возможность чтения ее один раз (например, с помощью Lazy<string> и static ) и повторного использования для всех вызовов функций.

Возможно, возникает проблема параллелизма, когда несколько потоков обращаются к коду. Также может помочь добавление lock вокруг кода. ConfigurationManager.ConnectionStrings должно быть безопасно для протектора, но, возможно, это не в среде выполнения V1.

Аналогичная проблема была опубликована здесь, но это касалось настроек приложения, а не строк подключения. Я не думаю, что использование CloudConfigurationManager должно быть правильным решением.

Вы также можете попробовать ввести строку подключения в настройки приложения, если вы не используете Entity Framework.

Строки подключения следует использовать с приложением-функцией только в том случае, если вы используете entity framework. Для других сценариев используйте настройки приложения. Нажмите, чтобы узнать больше. (через портал Azure)

Не уверен, относится ли это также к среде выполнения V1.

Комментарии:

1. Итак, что я сделал, так это добавил закрытую статическую строку для хранения строки подключения. когда она пуста, найдите ее в connectionstring в конфигурации. Если это не удается, сделайте паузу в 1/2 секунды и повторите попытку до 3 раз. За последний 1 час я не видел этого всплывающего окна с ошибкой. Я буду держать вас в курсе и добавлю код в качестве ответа.

2. Может быть известной проблемой: github.com/Azure/azure-functions-host/issues/1577 — Возможно, они исправили это только для среды выполнения V2.

3. Алекс, ваш ответ привел меня к решению, приведенному ниже. Спасибо за вашу помощь

Ответ №2:

Решением было добавить закрытую статическую строку для строки подключения. Затем считывайте данные из конфигурации только в случае сбоя. Затем я добавил повторную попытку, которая приостановилась на полсекунды. Это в основном предотвратило это.

 private static string connectionString = String.Empty;
    private string getConnectionString(int retryCount)
    {
        if (String.IsNullOrEmpty(connectionString))
        {
            if (System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"] != null)
            {
                connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MyEntity"].ToString();
            }
            else
            {
                if (retryCount > 2)
                {
                    throw new Exception("Failed to Get Connection String From Application Settings");
                }
                retryCount  ;
                getConnectionString(retryCount);
            }
        }
        return connectionString;
    }
  

Я не знаю, идеально ли это, но это работает. Я перешел от просмотра этого исключения 30 раз в день к отсутствию.