【问题标题】:Signalr - Join multiple groupsSignalr - 加入多个组
【发布时间】:2012-12-04 02:01:22
【问题描述】:

编辑:David Fowler 要求提供完整代码以尝试复制问题。这是完整的代码

除了这里转载的代码,我还上传了完整的Visual Studio 2010解决方案到以下网址

http://www.sendspace.com/file/lfeurf(网址现已过期,不再有效)

请随时下载并测试。

这是我的发现

  1. 在 Hub 代码中仅添加一个组将使应用程序正常工作 很好,没有问题
  2. 添加 2 个组将停止信号器 工作或将只在一个方向工作。即:消息将是 从浏览器 1 传输到浏览器 2 但不会传输 从浏览器 2 到浏览器 1

原问题: 我在 MVC3 网站中使用 Signalr 1.0.0-rc1。我的客户有时需要属于多个组。这是我的集线器和客户端javascript中的代码

客户端 JavaScript 和 HTML

<script type="text/javascript">
    //start signalr
    var message = $.connection.messageHub;

    // Declare a function on the message hub so the server can invoke it          
    message.client.send = function (message) {
        alert(message);
    }

    // Start the connection and join groups
    $.connection.hub.start();

    //bind click event of button to invoke send function on server
    $(document).ready(function () {
        $("#target").click(function () {
            message.server.send("Hello from signalr");
        });
    });
</script>

<button id="target">Click to send message to other clients</button>

服务器端集线器

public class MessageHub: Hub
    {
        public Task AddGroups()
        {
            //add 1st group
            Groups.Add(Context.ConnectionId, "foo");
            //add 2nd group
            return Groups.Add(Context.ConnectionId, "foobar");
        }

        //this method will be called from the client
        public void Send(string message)
        {
            Clients.OthersInGroup("foobar").send(message);
        }

        //automatically join groups when client first connects
        public override Task OnConnected()
        {
            return AddGroups();
        }

        //rejoin groups if client disconnects and then reconnects
        public override Task OnReconnected()
        {
            return AddGroups();
        }

    }

上面的代码应该在每个客户端第一次连接时添加两个组,但它不起作用。我使用调试器单步执行了 C# 代码,没有抛出任何错误。我也没有看到使用 Chrome 控制台的任何 javascript 错误,但客户端上没有调用 Send 函数。然后我将 AddGroups() 方法更改为仅添加一个组,如下所示

public Task AddGroups()
   {
        //dont add first group
        //Groups.Add(Context.ConnectionId, "foo");
        //add only second group
        return Groups.Add(Context.ConnectionId, "foobar");
   }

现在我的应用程序完美运行。如何添加第二组?看来我误解了加入多个组。谁能告诉我正确的方法吗?

【问题讨论】:

  • 客户端代码是什么样的?
  • @dfowler - 添加客户端代码
  • 发生的“确定”事件是什么,何时发生。我想重现问题,我想要您使用的 EXACT 代码
  • @dfowler - 大卫,我已经编辑了我的问题以包含完整的代码。此外,我还向sendspace.com/file/lfeurf 上传了一个演示问题的 VS2010 项目。您应该能够构建、运行和复制问题。
  • @dfowler - David,halter73 的修复对我来说非常有效。这是您可以在下一个版本中修复的错误,还是我以错误的方式使用 OnConnected 和 OnReconnected?

标签: c# asp.net-mvc-3 signalr signalr-hub


【解决方案1】:

MyHub.cs

public async Task Subscribe(IEnumerable<string> groups)
    {
        foreach(var group in groups)
        {
            await Groups.Add(Context.ConnectionId, group);
        }
    }

Javascript:

$.connection.hub.start().done(function () {
                var groups = ["foo","bar"];

                tileHub.server.subscribe(groups)
});

【讨论】:

    【解决方案2】:

    您的问题似乎是 AddToGroups 中的 return Groups.Add(Context.ConnectionId, "foobar"); 在 5 秒后超时。从 Groups.Add 返回的 Task 不会完成,直到 SignalR 验证具有指定 connectionId 的客户端已收到添加到组命令。如果这在 5 秒内没有发生,Task 将被取消。目前似乎存在一个错误,阻止在 OnConnectedOnReconnected 内部等待 Groups.Add

    由于您从OnConnectedOnReconnected 返回已取消的Task,因此服务器正在阻止客户端建立连接。

    一种解决方法是忽略从Groups.Add 返回的Task,如下所示:

    public class MessageHub: Hub
    {
        public Task AddGroups()
        {
            //add 1st group
            Groups.Add(Context.ConnectionId, "foo");
            //add 2nd group
            return Groups.Add(Context.ConnectionId, "foobar");
        }
    
        //this method will be called from the client
        public void Send(string message)
        {
            Clients.OthersInGroup("foobar").send(message);
        }
    
        //automatically join groups when client first connects
        public override Task OnConnected()
        {
            AddGroups();
            return base.OnConnected();
        }
    
        //rejoin groups if client disconnects and then reconnects
        public override Task OnReconnected()
        {
            AddGroups();
            return base.OnReconnected();
        }
    
    }
    

    【讨论】:

    • 你先生,太棒了!你是怎么想出来的?非常感谢您的修复。
    • 我实际上正在解决这个问题。感谢您报告错误。我在这里记录了这个问题:github.com/SignalR/SignalR/issues/1155
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2014-08-03
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多