使用 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 sql server 中使用查询输出作为列名

使用 SqlDataAdapter 时获取 SQL Server DATEDIFF 列作为 TimeSpan

在Sql Server 2016中使用For Json子句把数据作为json格式导出

在 SQL Server 中使用数据透视表作为视图

在Sql Server 2016中使用For Json子句把数据作为json格式导出

在 SQL Server 2008 中使用集合作为函数/存储过程的参数?