StackExchange.Redis в Azure Функции не работают - PullRequest
1 голос
/ 04 марта 2020

Я создал очень простой Azure Function, который использует Dependency Injection для использования моих общих библиотек.

Функция отлично работает локально на моем компьютере разработчика, но когда я публикую sh на Azure, я получаю ошибку, в которой говорится, что StackExchange.Redis не определена конечная точка - см. Ниже: enter image description here

Я где-то читал, что это может быть из-за того, что ConnectionMultiplexerr не было static. Вот код моего RedisCache клиента в моей общей библиотеке:

public class RedisCache
{
   private static IDatabase _cache;
   private static ConnectionMultiplexer connection;
   private Dictionary<string, SemaphoreSlim> _locks;

   public RedisCache(IConfiguration configuration)
   {
      var host = configuration["redisHost"];
      var key = configuration["redisKey"];
      if (_cache == null)
      {
         connection = ConnectionMultiplexer.Connect($"{host},abortConnect=false,ssl=true,password={key}");
        _cache = connection.GetDatabase();
      }
      _locks = new Dictionary<string, SemaphoreSlim>();
   }

   public async Task<T> GetObjectAsync<T>(string key)
   {
       var serializedCachedData = await _cache.StringGetAsync(key);

       if (!serializedCachedData.HasValue)
         return default(T);

       return JsonUtils.Deserialize<T>(serializedCachedData.ToString());
   }

}

А вот как я управляю созданием одноэлементного экземпляра моего RedisCache клиента в Startup.cs в моем приложении Azure Function:

public class Startup : FunctionsStartup
{
   public override void Configure(IFunctionsHostBuilder builder)
   {
      var configuration = new ConfigurationBuilder()
         .SetBasePath(Directory.GetCurrentDirectory())
         .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
         .Build();


      builder.Services.AddSingleton(new RedisCache(configuration));
    }
}

Есть идеи, что может быть причиной этой проблемы?

1 Ответ

1 голос
/ 04 марта 2020

Я думаю, что ваш appsettings.json не развернут должным образом. Можете ли вы проверить настройки приложения из Azure Portal, чтобы проверить, загружены ли ваши настройки. Также лучшим способом для SetBasePath является использование ExecutionContext. Например, код ниже

Использование контекста выполнения

var executioncontextoptions = builder.Services.BuildServiceProvider()
         .GetService<IOptions<ExecutionContextOptions>>().Value;

var currentDirectory = executioncontextoptions.AppDirectory;

Использование сборки

var binDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var currentDirectory = Path.GetFullPath(Path.Combine(binDirectory, ".."));

Также вам не хватает .AddEnvironmentVariables() на вашем ConfigurationBuilder. Это должно быть сделано так

var config = new ConfigurationBuilder()
        .SetBasePath(currentDirectory )
        .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
        .AddEnvironmentVariables()
        .Build();
...