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();
我创建了一个超级简单的 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();