SignalR OnConnected在另一台服务器上触发到它实际连接的服务器

时间:2019-03-18 16:27:48

标签: signalr web-farm

我正在IIS中使用SignalR和一个Web场,目前有3台服务器,并且请求通过ARR进行负载均衡。

我要与客户端连接的服务器处理某些发生的外部事件。因此,我想跟踪客户端当前连接的三台服务器中的哪一台。

我认为我可以使用OnConnected做到这一点,并且在该方法中,将MachineName相对于Redis中的ConnectionID存储。 问题在于,OnConnected似乎被称为与客户端连接的服务器不同的 服务器。

根据调查,似乎有三个调用,一个调用/ negiotate一个调用/ connect和一个调用/ start。 / connect似乎是websocket连接,该连接在整个过程中一直保持不变,其他连接只是暂时的。 这三个连接可以发生在不同的服务器上,似乎websocket连接可以是到服务器A的(因此,这是客户端的SignalR连接要连接到的服务器),但是OnConnected在服务器B上被触发了。

我想知道我是否忽略了让我看到SignalR连接实际连接到哪个服务器的东西?

谢谢

2 个答案:

答案 0 :(得分:0)

如果要使用Web场,则需要实现一个背板来跟踪所有消息传递。

https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr

如果没有适当的背板实现,则无法做您想做的事。

答案 1 :(得分:0)

我相信这是您必须保存的东西。假设您正在为mapping users使用数据库,则可以有一个附加字段,例如“ LoggedInOn”,并存储服务器主机名或其他标识符。

但是,除了要进行故障排除的某些方面之外,正确的消息发送/接收应该穿过背板到达所有服务器。这样,无论它们连接到哪个服务器,都会收到消息。

如果您说的是外部事件,则一旦事件完成并且准备好将消息发送回客户端,则底板应将其推送到所有服务器。

如果没有发生,我将按照Kelso Sharp的说法审阅文档。