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

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

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

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


person DanScan    schedule 02.03.2019    source источник


Ответы (2)


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

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

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

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

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

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

person Alex AIT    schedule 02.03.2019

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

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 раз в день к отсутствию.

person DanScan    schedule 05.03.2019