【发布时间】:2026-02-20 14:40:01
【问题描述】:
我有以下情况:我有一个 SignalR 应用程序,其中我使用 Autofac 作为依赖关系解析器。
public class Startup
{
public void Configuration(IAppBuilder app)
{
var container = new AutofacContainer().Container;
var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
app.UseAutofacMiddleware(container);
app.MapSignalR(new HubConfiguration
{
Resolver = resolver
});
resolver.UseRedis("192.168.122.213", 6300, "", "FLEDGG");
AddSignalRInjection(container, resolver);
}
private void AddSignalRInjection(IContainer container,IDependencyResolver resolver)
{
var updater = new ContainerBuilder();
updater.RegisterInstance(resolver.Resolve<IConnectionManager>());
updater.Update(container);
}
}
这是AutofacContainer 类。
public class AutofacContainer
{
public IContainer Container { get; set; }
public AutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterHubs(Assembly.GetExecutingAssembly())
.PropertiesAutowired();
builder.RegisterType<Test>()
.As<ITest>()
.PropertiesAutowired();
Container = builder.Build();
}
}
现在,the official SignalR Redis scaleout documentation from Microsoft 表示我应该将GlobalHost.DependencyResolver 告诉UseRedis。
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName");
app.MapSignalR();
}
由于我不再在应用程序中使用GlobalHost(即使我使用GlobalHost,Redis 中也绝对没有任何行为)(as the Autofac integration with SignalR and Owin indicates):
OWIN 集成中的一个常见错误是使用 GlobalHost。在欧文 您从头开始创建配置。你不应该参考 使用 OWIN 集成时的任何地方的 GlobalHost。
由于现在配置了 Startup 类:
var resolver = new AutofacDependencyResolver(container);
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
所以我创建了一个AutofacDependencyResolver 类型的新resolver,它成功连接到Redis PubSub。然而问题是,如果我尝试发送一条消息,该消息将重复数千次。
(在 Chrome 控制台中,为了从服务器发送一条消息,我最终会陷入无限循环,而客户端会无限次接收它。
所以,问题是:如何在使用 Autofac 作为依赖解析器时设置 SignalR Redis 横向扩展(注意:没有情况可以使用另一个依赖解析器)。
谢谢!
编辑:如果您想了解有关解决方案的更多信息,here is the repo 没有此行:
resolver.UseRedis("serverIp", portNumber, "password", "channelName");
谢谢!
编辑:我觉得我应该澄清一些事情:如果我使用 resolver.UseRedis();,通常会发送(一次)的每条消息都会发送多次 - 所以如果我使用 subscribe "channelName" 在 Redis 中订阅“channelName” ,我发现它与客户端的行为一致:每条消息都被发送多次。
接下来要做的是有一个没有 Autofac 的基本 SignalR 应用程序,看看 Redis 的行为,虽然我觉得这是一个 Autofac 相关的问题,更具体地与配置有关。
谢谢!
更新:显然,没有 Autofac 的基本 SignalR 应用程序中存在相同的行为。该问题与 Autofac 无关。
【问题讨论】:
标签: dependency-injection redis signalr autofac signalr-backplane