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