我正在try 将Azure Redis缓存添加到我的.NET 8 API中.我添加了连接字符串,并添加了如下代码:
services.AddStackExchangeRedisCache(
options =>
{
options.Configuration = builder.Configuration.GetConnectionString("RedisCache");
options.InstanceName = builder.Environment.EnvironmentName;
})
.AddDistributedMemoryCache();
当我在连接字符串中添加我的密码时,这是有效的.但我不想这样做,我想使用Entra ID身份验证.因此,我启用了该选项,并 Select 了需要使用它的Web应用程序(也是在Azure中).访问策略AS data owner
.但是,当我省略密码时,我会收到一个错误:
StackExchange.Redis.RedisConnectionException:‘消息超时 在Backlog中try 发送,因为没有连接 可用(5000ms)-上次连接异常:身份验证失败 在tsg-pas-dev-redis.redis.cache.windows.net:6380/Interactive,上 已刷新/ComputeResult,最后:回应,来源:SetResult,未完成:0, 上次读取时间:0s前,上次写入时间:0s前,Keep-Alive:60s,状态: 已连接正在建立,管理器:10个中的9个可用,最后一个心跳:从不, 全局:0S前,v:2.6.122.38350,命令=设置,超时:5000,实例: 12,QU:1,QS:0,AW:FALSE,BW:SpinningDown,rs:ReadAsync,ws: 已刷新、输入:0、后进:0、当前输入:0、同步操作:1、异步操作:1、 服务器终端:tsg-pas-dev-redis.redis.cache.windows.net:6380, 连接秒:0.23,AOC:0,MC:1/1/0,管理器:10个可用, 客户端名称:DBSX1Y6-54977(SE.Redis-v2.6.122.38350),IOCP: (忙=1,空闲=999,最小=8,最大=https://stackexchange.github.io/StackExchange.Redis/Timeouts0),工人: (忙碌=1,空闲=32766,最小=8,最大=32767),池: (线程=15,队列条目=0,完成条目=347,计时器=3),v: 2.6.122.38350(请阅读本文,了解一些可能导致超时的常见客户端问题: https://stackexchange.github.io/StackExchange.Redis/Timeouts)‘
异常:错误:需要NOAUTH身份验证.验证Redis是否 提供的密码正确.try 的命令:ECHO
你知道我错过了什么吗?我记得,对于其他服务之一,我必须做一些主要的事情,获取/初始化令牌……但不知道这是否相关.
--编辑:
在回答下面的问题后,我做了一个小更改,这样我仍然可以使用IDistributedCache
,因为在本地我仍然可以使用内存缓存:
public static void AddDistributedCache(this IServiceCollection services, WebApplicationBuilder builder)
{
if (builder.Configuration["UseMemoryCache"]?.Equals("yes", StringComparison.OrdinalIgnoreCase) ?? true)
{
services.AddDistributedMemoryCache();
}
else
{
services.AddStackExchangeRedisCache(options =>
{
options.InstanceName = builder.Environment.EnvironmentName;
options.ConnectionMultiplexerFactory = () => ConnectionMultiplexerFactory(builder);
})
.AddDistributedMemoryCache();
}
}
private static async Task<IConnectionMultiplexer> ConnectionMultiplexerFactory(WebApplicationBuilder builder)
{
var configurationOptions = await ConfigurationOptions.Parse(builder.Configuration.GetConnectionString("RedisCache")!)
.ConfigureForAzureWithTokenCredentialAsync("XXXX", new DefaultAzureCredential());
var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions);
return connectionMultiplexer;
}
XXX需要来自应用程序设置,尽管我还不明白我为什么需要它.当在同一个Redis AChe实例上使用多个应用程序时,我想还不是很方便……但至少没有密码:)
这样做的好处是,我可以很容易地切换,也不必担心多路复用器getDatabase
等.