使用 sql server 作为 backlplane 时 SignalR 不起作用
Posted
技术标签:
【中文标题】使用 sql server 作为 backlplane 时 SignalR 不起作用【英文标题】:SignalR not working when using sql server as backlplane 【发布时间】:2013-07-31 16:00:08 【问题描述】:我尝试使用 SQL Server 和 SignalR 设置以下配置
http://www.asp.net/signalr/overview/performance/scaleout-with-sql-server
一切似乎都设置正确,如果我分析 SQL 服务器,我可以看到 SignalR 调用数据库,但是当我调用集线器向所有连接的客户端发送消息时,消息永远不会发送到连接的浏览器.
知道可能是什么问题吗?
【问题讨论】:
您是否检查过网络流量以确保消息不会返回浏览器?可能您的方法签名不匹配(大小写),因此处理程序没有正确连接。 所以,一切正常,但是我设置依赖注入的方式是错误的。当我使用单例时,必须在每次请求时重新创建 IHubContext。 我在部署时遇到了同样的问题——异常:System.InvalidOperationException 消息:可空对象必须有一个值。 StackTrace:在 Microsoft.AspNet.SignalR.SqlServer.SqlReceiver.Receive(Object state) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext , ContextCallback 回调, 对象状态, Boolean preserveSyncCtx) ... 【参考方案1】:谢谢@smnbss,您在问题中的评论挽救了我的生命。只是为了让以后遇到同样问题的每个人都清楚,这里是错误的实现:我只得到了一次上下文:
public class SyncService : ISyncService
private IHubContext StatusChangeHub get; set;
public GatewaySyncService()
StatusChangeHub = GlobalHost.ConnectionManager.GetHubContext<Hub>();
public void SyncStatusChange(Status newStatus)
StatusChangeHub.Clients.All.onStatusChange(newStatus);
但不知何故,这只能在不使用背板的情况下工作。以及正确的实现:每次要发送消息时都需要获取上下文:
public class SyncService : ISyncService
public void SyncStatusChange(Status newStatus)
var context = GlobalHost.ConnectionManager.GetHubContext<Hub>();
context.Clients.All.onStatusChange(newStatus);
【讨论】:
我也有同样的问题。您找到更好的解决方法了吗?以上是关于使用 sql server 作为 backlplane 时 SignalR 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
使用 SqlDataAdapter 时获取 SQL Server DATEDIFF 列作为 TimeSpan
在Sql Server 2016中使用For Json子句把数据作为json格式导出