Signalr 信号机';长轮询';同时发送多个请求

Signalr 信号机';长轮询';同时发送多个请求,signalr,long-polling,Signalr,Long Polling,我为我的网站写了一个简单的“分析”跟踪工具,它有布尔列,如 已访问门店 已访问\u主页 签出\u已启动 main视频\u播放 MainVideo\u已完成 我也在使用Google Analytics,但我想在montor活动中找到一个次要位置 我主要在Chrome上测试我的应用程序,默认情况下Chrome将使用web套接字。我切换到长轮询,因为我希望能够在Fiddler中监视请求 中心的工作方式非常简单。当特定事件完成时,信号器客户端发送设置标志(列)的事件。因此,在调用时,它会执行以下操作:

我为我的网站写了一个简单的“分析”跟踪工具,它有布尔列,如

已访问门店
已访问\u主页
签出\u已启动
main视频\u播放
MainVideo\u已完成

我也在使用Google Analytics,但我想在montor活动中找到一个次要位置


我主要在Chrome上测试我的应用程序,默认情况下Chrome将使用web套接字。我切换到长轮询,因为我希望能够在Fiddler中监视请求

中心的工作方式非常简单。当特定事件完成时,信号器客户端发送设置标志(列)的事件。因此,在调用时,它会执行以下操作:

  • 为用户查找行-如果不存在,则创建
  • 设旗
  • 保存行
我没有并发问题,直到我切换到长轮询——当我发现即时死锁时

我的客户机通常会同时发送多个事件(单独的问题要解决-是),当使用web套接字时,它们会很好地排队并逐个执行。所以很明显,任何僵局都不太可能发生

长轮询是另一回事——我突然发现我的hub方法被多次输入,并试图创建多行,到处都是死锁和“行修改”错误

一个简单的解决方案是在发出请求时锁定(lockObj),但如果我有很多客户机,我宁愿不这样做。另一种方法是捕获死锁并重新执行现在几乎每次页面加载都会发生的请求


是否有一种方法可以将信号器长轮询配置为而不是一次发送所有请求?或者以其他方式依次执行请求(如ASP.NET在使用SessionState时所做的)。

听起来更深层次的问题是,您的数据库层不允许并发访问,也许您希望首先关注这一点。这是我最初的想法,但第一个请求(会话中不存在数据库行)会发生什么情况就是在同一时间创建两个内存行,然后插入。数据库检测到主键冲突或死锁,但这似乎不必要地占用了资源。我不确定db还能做些什么。即使是空行的原子创建也只能部分解决第一个事件的问题