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

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

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

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

1 ответ

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

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

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

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

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

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

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

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 раз в день до нуля.

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