我们正在使用SignalR将通知发布到已连接的JavaScript客户端。当客户端直接连接时,我们使用Web套接字。当他们通过我们的代理连接时,我们会使用长时间轮询。
注意:当我们绕过代理时,这里描述的问题不会发生,因此显然是问题-但我们正在努力找出可能是什么问题。
通过代理使用长时间轮询时,我们看到一些奇怪的现象,似乎表明缓冲的消息未发送给客户端,即,如果这些客户端在打开客户端时没有打开的/signalr/poll
请求,事件被发布,那么他们将永远不会收到它。在服务器上进行跟踪,表明相关消息已发布到正确的连接ID。
我很想了解SignalR如何将长轮询请求转换为连接ID,以及如何关联缓冲的消息,因为这可能有助于解释我所看到的行为。
步骤:
POST: /signalr/poll
/signalr/poll
请求收到包含消息1的响应/signalr/poll
请求。假设没有其他事件发布,它将一直打开直到超时。客户端永远不会看到事件2。注意:如果我们为LongPollDelay设置一个值,例如,我们也会看到类似的行为。 30秒,以便仅间歇性地连接客户端。似乎好像没有待处理的/signalr/poll
请求,那么该消息就永远不会发送给客户端-我只能认为这与消息缓冲有关?
我们当前正在使用2.4.0,但是在2.2.1和2.3.0中会看到相同的问题。