Aspire配置SignalR Redis背板时无法连接容器内Redis
我有一个启用Aspire的通用.NET Blazor Web应用,尝试配置SignalR使用Redis作为背板。Redis运行在Docker/Podman容器中,Aspire仪表板显示其运行正常,且我能通过telnet连接Redis服务器。
AppHost的Program.cs代码:
var builder = DistributedApplication.CreateBuilder(args); var redis = builder.AddRedis("redis-cache"); builder.AddProject<Projects.BlazorSingalRApp1>("blazorsingalrapp1") .WithReference(redis); builder.Build().Run();
API服务(BlazorSingalRApp1)项目的Program.cs配置:
builder.Services.AddSignalR() .AddStackExchangeRedis("redis-cache", options => { options.Configuration.ChannelPrefix = "MyApp"; options.Configuration.AbortOnConnectFail = false; });
运行AppHost时,后端API服务无法连接,日志显示:
fail: Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager[7] Not connected to Redis.
尝试发送消息时,后端抛出错误:
StackExchange.Redis.RedisConnectionException: UnableToConnect on redis-cache:6379/Subscription
推测可能是AddStackExchangeRedis调用未使用Aspire提供的连接字符串,请问哪里配置遗漏了?
核心问题是未正确使用Aspire注入的Redis配置,直接传入"redis-cache"作为连接字符串无法读取到Aspire自动生成的容器连接信息,按以下步骤修复:
安装Aspire专属集成包
确保API项目已安装Aspire.Microsoft.AspNetCore.SignalR.StackExchangeRedisNuGet包,这个包是Aspire为SignalR Redis背板提供的官方集成,能自动处理连接配置注入。修改SignalR配置代码
替换原有的AddStackExchangeRedis调用,使用Aspire提供的扩展方法AddRedisBackplane,它会自动读取Aspire注入的Redis连接字符串:builder.Services.AddSignalR() .AddRedisBackplane(options => { options.Configuration.ChannelPrefix = "MyApp"; options.Configuration.AbortOnConnectFail = false; });若需手动获取连接字符串,也可以直接从配置中读取Aspire注入的键值:
var redisConnStr = builder.Configuration.GetConnectionString("redis-cache"); builder.Services.AddSignalR() .AddStackExchangeRedis(redisConnStr, options => { options.Configuration.ChannelPrefix = "MyApp"; options.Configuration.AbortOnConnectFail = false; });配置逻辑说明
Aspire在通过WithReference(redis)关联项目和Redis组件后,会自动在API项目的配置系统中添加名为redis-cache的连接字符串,包含容器网络内的正确Redis地址和认证信息,直接用字符串"redis-cache"无法解析到实际连接参数。
内容的提问来源于stack exchange,提问作者Alec

