我有一个运行某些进程的Windows服务,必须在浏览器上通知它的进度。我不确定自己是否做得很好,但是我只是做了:
Windows Service publish a json on a redis channel called 'web'
-> An action on ASP.NET MVC application subscribe the 'web' channel and send the json to browser via signalR hub
-> the browser take it and show the progress
。
我有以下代码(它是一个帮助程序),用于在发布后添加频道范围。从我的控制器/操作中调用它:
public void Listen(string channel, Action<string, object> action)
{
var sub = Client.GetSubscriber();
sub.Subscribe(channel, (c, v) =>
{
action(c.ToString(), v.ToString());
});
}
问题:它可以正常运行,并且通知浏览器。问题是用户(在浏览器上)按下F5或再次执行操作时。它创建了一个新频道,我收到了重复的消息。如果用户再次执行它,我开始每条消息收到3条消息,依此类推。我想避免它。
我尝试过的操作:我尝试使用IsConnection(channel)
,但它始终返回true
。我已经尝试在Unsubscribe(channel)
之前再次Subscribe(channel)
,并且它可以工作,但是我不确定是否会丢失一些消息(恐怕)。我不知道如何解决它,避免重复订阅。有人可以帮助我吗?
谢谢。
答案 0 :(得分:0)
您是否正在使用ConnectionMultiplexer
?参见Using redis pub/sub。
...如果连接失败,ConnectionMultiplexer将 处理重新订阅所请求频道的所有详细信息
考虑从发布/订阅切换到Redis流。参见What are the main differences between Redis Pub/Sub and Redis Stream?
您可以使用groups and clients来命名Consumer Groups。因此,您可以通过会话或其他任何方式对其进行控制,甚至可以使用fingerprint.js之类的方式来匿名标识每个浏览器。