StackExchange.Redis 在 Azure Functions 中不工作

StackExchange.Redis in Azure Functions not working

我创建了一个超级简单的 Azure Function,它使用 Dependency Injection 来利用我的共享库。

该函数在我的开发机器上本地运行良好,但是当我将它发布到 Azure 时,我收到一条错误消息,指出 StackExchange.Redis 没有指定端点——见下文:

我在某处读到这可能是由于 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());
   }

}

下面是我如何在我的 Azure Function 应用程序的 Startup.cs 中创建我的 RedisCache 客户端的单例实例:

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));
    }
}

知道是什么导致了这个问题吗?

我认为您的 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, ".."));

此外,您的 ConfigurationBuilder 上还缺少 .AddEnvironmentVariables()。应该这样做

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