所以我有以下情况
TLDR:为什么信号器会保留每个连接的依赖关系?而不是按要求?
我最初用mvc 3制作了网站,并实现了以下内容 https://stackoverflow.com/a/22750142/28145
来自这篇文章 SignalR 2 Dependency Injection with Ninject
此帖子上接受的答案现在是 http://www.tomdupont.net/2014/01/dependency-injection-with-signalr-and.html
但这两种实现似乎对我的问题都没有影响。
我的网站已迁移到mvc 4,现在已经是mvc 5并且已经存在了很长时间。
我刚刚发现这个问题,因为我从未触发从客户端到信号器集线器的数据更改。
我验证这一点的方法是给我的IUnitOfWork实现一个在构造函数中生成的ID。
复制步骤:
您输入mvc页面/ site / action并获取html页面,html页面连接到您的集线器并实例化IUnitOfWork,您可以执行一些查询并返回一些数据。
另一个用户在同一个集线器上进入该站点并查询一些数据。
当第一个用户连接时检查IUnitofWork标识符时,标识符的值为1
第一个用户在集线器上执行服务器端操作,此操作
当第二个用户加载页面时,IUnitOfWork标识符为2,此页面在第一个用户执行其操作之前加载。
现在,另一个连接上的第二个用户在集线器上执行服务器端操作。此操作依赖于来自第一个用户的数据,它查询IUnitOfWork,从而查询属性Broken的DbContext。令我惊讶的是Broken = false的值,因此该动作什么都不做。 操作期间的IUnitOfWork标识符仍为2
第二个用户现在用F5刷新页面,结果signalr创建了一个新连接。 IUnitOfWork标识符现在为3
第二个用户再次尝试执行该功能。但是这次查询返回Broken = true,正如预期的那样。虽然IUnitOfWork标识符仍为3.原因是在第一个用户操作更改数据后初始化了上下文。
答案 0 :(得分:0)
在没有看到任何代码的情况下很难给出准确的答案,但我的猜测是你没有重新创建SQLDependency触发器和/或重新附加事件处理程序。 SQLDT是一次性交易,如果你不重新创建它们,它们永远不会再次触发,加载页面的第二个用户在初始化时重新创建新的触发器,并且一旦你刷新了页面刷新,刷新页面断开连接并重新连接新的connectionid和新的触发器。