我已成功实施SignalR。客户端导航时SignalR消息丢失
我使用它来显示站点上用户之间的初始对话,所以当想要与其他人聊天时,使用SignalR发送简单的消息。
这种效果很好,除了一种情况。如果请求发送的时间与应接收请求的时间相同,正在执行新的页面请求,如导航站点,则该消息将丢失。
我可以看到邮件在InProcMessageBus中30秒后过期,但我不认为这是问题,因为我在我的机器上测试并且页面加载最多需要1-2秒。
那么,这实际上是由设计?还是我做错了?
谢谢。
我已成功实施SignalR。客户端导航时SignalR消息丢失
我使用它来显示站点上用户之间的初始对话,所以当想要与其他人聊天时,使用SignalR发送简单的消息。
这种效果很好,除了一种情况。如果请求发送的时间与应接收请求的时间相同,正在执行新的页面请求,如导航站点,则该消息将丢失。
我可以看到邮件在InProcMessageBus中30秒后过期,但我不认为这是问题,因为我在我的机器上测试并且页面加载最多需要1-2秒。
那么,这实际上是由设计?还是我做错了?
谢谢。
这是有点设计。当用户创建一个新的连接时,他们默认会得到一个新的连接。这可能是问题的原因,除非你已经定义了你自己的IConnectionIdFactory
。如果你想确保客户总是得到相同的ID,你会创建自己的实现这一点,并设置它是这样的:
DependencyResolver.Register(typeof(IConnectionIdFactory),() => new CustomIdFactory());
扩展在SignalR - https://github.com/SignalR/SignalR/wiki/Extensibility
实例工厂更换为clientID的:http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/
感谢您的回答。 对不起,我没有提到这个问题,但我已经这样做了。我使用登录的用户的id,并通过fiddler查看请求,我可以看到connectionId对于来自同一用户的每个请求都是相同的。 所以实际上,我的问题仍然存在,即使我使用我自己独特的connectionId。 – 2012-03-13 12:17:51
我很困惑,你是说如果一收到邮件就没有收到邮件就立即刷新? – davidfowl 2012-03-14 10:07:22
我认为实际上这个消息是发送给客户端的,只是客户端错过了它,就像从未触发集线器事件一样,因为浏览器已经处于重新加载页面的模式,并且当新页面重新加载,客户并没有收到信息,就是在场外。我想你明确表示,这是设计。所以我必须跟踪服务器上的消息。不管怎么说,还是要谢谢你。 – 2012-03-14 13:24:57