我们已经在 web 应用的 owin 启动代码中配置了 redis 背板。
var config = new RedisScaleoutConfiguration(hangfireRedisConnection, scaleoutEventKey);
GlobalHost.DependencyResolver.UseRedis(config);
app.MapSignalR();
Web 应用程序在计时器上运行后台作业,如果发生重要事件,该作业会唤醒并通知客户端。查询后端后,后台作业调用一个简单的 HubService 包装器,该包装器将 IHubContext 作为依赖项,并最终调用集线器上的 Client.All.notify 方法向下推送到客户端:
中心服务:
private readonly IHubContext applicationHub;
public HubService(IHubContext applicationHub)
{
this.applicationHub = applicationHub;
}
public void NotifyClient()
{
hubContext.Client.All.nofify(message); // <- this is always called, with and without the backplane, however with the backplane it doesn't make it to the client
}
HubContext 在启动时注册:
Container.RegisterInstance<IHubContext>(GlobalHost.ConnectionManager.GetHubContext<ApplicationHub>());
这在没有背板的情况下工作正常,但在配置背板的情况下不起作用。我已经在调试器中验证了正在进行调用,但它并没有将其传递给客户端。
此外,如果我们通过 js 或 signalr.client 客户端从客户端(Web 应用程序外部)调用信号器集线器,则背板会像宣传的那样工作。
在我们从 Web 应用程序本身直接调用集线器上下文而不首先从客户端启动调用的场景中是否缺少某些东西?