C# 使用可从信号器观察到的共享IObservable
假设我有一个C# 使用可从信号器观察到的共享IObservable,c#,asp.net,signalr,system.reactive,C#,Asp.net,Signalr,System.reactive,假设我有一个IObservableserverside,存储在一个静态字段或任何东西中 我们还假设我有一个signarhub,它有一个Subscribe方法,还有一个signarclient,它有一个notify功能 public static IObservable<string> Events; protected void Application_Start() { //dummy observable just to generate events for me..
IObservable
serverside,存储在一个静态字段或任何东西中
我们还假设我有一个signarhub,它有一个Subscribe
方法,还有一个signarclient,它有一个notify
功能
public static IObservable<string> Events;
protected void Application_Start()
{
//dummy observable just to generate events for me..
Events = Observable
.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(50))
.Select(l => l.ToString());
...snip..
}
以及:
我需要做什么才能让所有客户共享可观察到的内容?
也就是说,我希望每个连接的客户端在订阅后都能接收最近200个事件。然后,每个客户机都应该实时记录相同的事件
我想应该以某种方式使用IObservable的Replay
方法。
我希望它的行为类似于聊天,用户可以实时查看最后x条消息+每个新事件
除了如何实际组合可观察的查询外,在Asp.NET中存储和设置共享事件流的最佳方法是什么?这是一个非常常见的体系结构问题-将实时流与“世界状态”相结合。您要做的是利用SignalR向当前订阅者广播实时消息(它擅长的是),并使用单独的API调用加入客户端以获取历史消息 在客户机中,您提供的逻辑首先订阅live Signal消息流,然后请求已经发生的消息的历史记录(“世界状态”)——通常最好作为简单的有序列表向后拉 存在一种固有的竞争条件,可能导致在实时流和历史记录中接收消息-因此您必须注意消除重复或“消除重复”您的消息列表 如何持久化消息可以作为一个完全独立的问题来处理 历史和实时流的这种分离提供了处理这两者的灵活性,并提供了提高效率的机会,例如,翻页到历史,而不是抓住整个过程 有几个问题和答案讨论了如何利用Rx将历史记录和实时数据结合起来——您需要在客户端javascript中这样做,而我对Rx js不是很在行
看看关于这个问题的一些讨论,还有-我有一些关于后一种情况的示例代码,这是一个纯粹的.NET场景。这就是jabbr所做的。这是一个非常常见的问题,我认为是时候发表博客了!数据库+事件存储+信号器+接收FTW!你是提议还是建议李我是否错过了这个问题,或者将
.Replay(200).RefCount()
执行此任务?通常情况下,这并不是那么简单。如果您在一个web场中,或者服务器重新启动等等,该怎么办。
public class MyHub1 : Hub
{
public void Subscribe()
{
Clients.All.notify("start");
WebApiApplication.Events
.Subscribe(s => Clients.Caller.notify(s));
}
}
myHub.client.notify = function (event) {
console.info(event);
};