我正在IIS中使用SignalR和一个Web场,目前有3台服务器,并且请求通过ARR进行负载均衡。
我要与客户端连接的服务器处理某些发生的外部事件。因此,我想跟踪客户端当前连接的三台服务器中的哪一台。
我认为我可以使用OnConnected做到这一点,并且在该方法中,将MachineName相对于Redis中的ConnectionID存储。 问题在于,OnConnected似乎被称为与客户端连接的服务器不同的 服务器。
根据调查,似乎有三个调用,一个调用/ negiotate一个调用/ connect和一个调用/ start。 / connect似乎是websocket连接,该连接在整个过程中一直保持不变,其他连接只是暂时的。 这三个连接可以发生在不同的服务器上,似乎websocket连接可以是到服务器A的(因此,这是客户端的SignalR连接要连接到的服务器),但是OnConnected在服务器B上被触发了。
我想知道我是否忽略了让我看到SignalR连接实际连接到哪个服务器的东西?
谢谢
会
答案 0 :(得分:0)
如果要使用Web场,则需要实现一个背板来跟踪所有消息传递。
https://docs.microsoft.com/en-us/aspnet/signalr/overview/performance/scaleout-in-signalr
如果没有适当的背板实现,则无法做您想做的事。
答案 1 :(得分:0)
我相信这是您必须保存的东西。假设您正在为mapping users使用数据库,则可以有一个附加字段,例如“ LoggedInOn”,并存储服务器主机名或其他标识符。
但是,除了要进行故障排除的某些方面之外,正确的消息发送/接收应该穿过背板到达所有服务器。这样,无论它们连接到哪个服务器,都会收到消息。
如果您说的是外部事件,则一旦事件完成并且准备好将消息发送回客户端,则底板应将其推送到所有服务器。
如果没有发生,我将按照Kelso Sharp的说法审阅文档。