Функциональному приложению Azure не удалось загрузить System.IO.Конвейеры, подключающиеся к Redis

#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 такой проблемы нет.