#stackexchange.redis #azure-function-app
#stackexchange.redis #azure-function-app
Вопрос:
Создано новое функциональное приложение, HTTP-триггер в VS2019 (16.8.3) для подключения к Azure Cache для Redis. Добавлен StackExchange.Redis 2.2.4 из nuget.
local.settings.json содержит ключ / значение RedisConnectionFromKeyVault и основную строку подключения из ключей доступа с портала.
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"RedisConnectionFromKeyVault": "<<SNIP>>.redis.cache.windows.net:6380,password=<<SNIP>>,ssl=True,abortConnect=False"
}
}
Добавлены следующие строки в код функции по умолчанию:
var connectionRedis = Environment.GetEnvironmentVariable("RedisConnectionFromKeyVault", EnvironmentVariableTarget.Process);
var cache = ConnectionMultiplexer.Connect(connectionRedis).GetDatabase();
Когда я запускаю и запускаю функциональное приложение локально, я получаю следующее исключение для ConnectionMultiplexer.Вызов подключения.
System.Private.CoreLib: Exception while executing function: Function1. StackExchange.Redis: Could not load file or assembly 'System.IO.Pipelines, Version=5.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.
at StackExchange.Redis.ConnectionMultiplexer.Connect(ConfigurationOptions configuration, TextWriter log) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 1032
at StackExchange.Redis.ConnectionMultiplexer.Connect(String configuration, TextWriter log) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 1015
at FunctionApp1.Function1.<Run>d__0.MoveNext() in E:GitReposFunctionApp1FunctionApp1Function1.cs:line 26
Пробовал аналогичный код в консольном приложении, и он работает нормально?
Чего мне не хватает? Почему функциональное приложение считает, что оно не может найти сборку System.IO.Pipelines?
Даже если я явно включу пакет nuget System.IO.Piplelines, он его не находит?
Ответ №1:
Похоже, это известная проблема с функциями Azure, как указано в https://github.com/Azure/azure-functions-host/issues/5894
Возникли проблемы со StackExchange.Redis https://github.com/StackExchange/StackExchange .Redis /проблемы / 1637
https://github.com/StackExchange/StackExchange .Redis /проблемы / 1655
Проблему можно решить, добавив элемент _FunctionsSkipCleanOutput, как показано ниже, в csproj
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput> <!-- *** this line is new ** -->
</PropertyGroup>
Комментарии:
1. Добавление <_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput> в мой файл проекта функции не сработало для меня. <PropertyGroup> <targetFramework>netcoreapp3.1</targetFramework> <AzureFunctionsVersion>v3</AzureFunctionsVersion> <FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput> </PropertyGroup> и исключение, которое я получаю на консоли — «Анонимно размещенный Сборка DynamicMethods: ссылка на объект не установлена для экземпляра объекта «. когда я пытаюсь внедрить IDistributedCache в конструктор.
Ответ №2:
Хорошо, я нашел, как обойти это.
Я имел в виду пакет StackExchange.Redis 2.2.4 (что заставляло Azure загружать System.IO.Pipelines 5.x).
Я заменил этот пакет на Microsoft.Расширения.Кэширование.StackExchangeRedis 5.0.1 (который, в свою очередь, ссылается на StackExchange.Redis 2.0.593, который ссылается на System.IO.Pipeline 4.5.2).
Теперь мои функции работают правильно.
Не уверен, что это долгосрочное решение.
Спасибо.
Комментарии:
1. Это действительно помогает. Должна быть какая-то несовместимость между StackExchange. Redis 2.2.4 и функция Azure?
2. похоже на StackExchange. Redis 2.2.3 обновил зависимость для System.IO.Pipelines с 4.7.1 до 5.0.0, что приводит к сбою. StackExchange. В Redis 2.1.58 такой проблемы нет.