2013-06-27 40 views
2

我正在使用PersistentConnection向连接的客户端发布大量数据(许多小包)。它基本上是单向的数据方向(因为每个客户端将调用其他服务器上的端点来设置各种订阅,所以它们不会通过SignalR连接将任何数据推送回服务器)。如何在服务器端节制SignalR客户端

有什么方法可以检测到客户端无法跟上发送给它的消息吗?

这个例子可能是一个连接不好的移动客户端(例如在漫游的情况下,速度可能会有很大的变化)。如果我们每秒发送100条消息,但客户端只能处理10条消息,则最终会丢失消息(由于服务器端的消息缓冲区)。

我正在寻找一个服务器端事件,类似于(SignalR)客户端上完成的事件,例如,

protected override Task OnConnectionSlow(IRequest request, string connectionId) {} 

但是,这不是框架的一部分(出于好的理由,我假设)。

我已经考虑过使用这个方法(在Stackoverflow的其他地方建议),让客户端告诉服务器(例如每10-30秒)它接收了多少消息,如果这个数字与数量有很大区别发送给客户端的消息,很可能客户端无法跟上。

该事件将用于告知分布式后端客户端无法跟上,然后关闭数据生成速率。

+0

好问题。我刚刚发布了一个类似的话,然后看到你的问题。 –

回答

1

除了编写自定义的东西之外,现在还没有办法对此进行此操作。过去我们已经讨论过这个潜在特征,但它现在不在任何地方。目前还不清楚“慢”是什么意思,因为它取决于应用程序的决定。可能会有某种基于带宽/时间/消息的设置,这会使此假设事件触发。

如果你想在非常低的层次上挂钩,你可以使用owin中间件来替换客户端的底层流,以便你可以看到所有的数据都在写入(你会必须为websockets做同样的事情,这可能不是微不足道的)。

一旦你有了这些,你可以编写一些基于时间的逻辑来确定flush是否花了太长时间并以这种方式杀死客户端。

这非常模糊,但它基本上是一个这样的功能如何工作的大脑转储。

+0

感谢您的快速回复 - 我没有想到您手边有一个小小的解决方案,但很高兴知道它已经被考虑和没有计划。我可能会把它保留下来,如果我们发现那个方向有问题的话,我会把它拿起来。 – cwt237