gpt4 book ai didi

c# - Signalr - 加入多个群组

转载 作者:太空狗 更新时间:2023-10-30 00:33:03 25 4
gpt4 key购买 nike

编辑: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。我的客户有时需要属于多个组。这是我的 Hub 和客户端 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 错误,但是没有在客户端上调用发送函数。然后我更改了 AddGroups() 方法以仅添加一个组,如下所示

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

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

最佳答案

您的问题似乎是 AddToGroups 中的 return Groups.Add(Context.ConnectionId, "foobar"); 在 5 秒后超时。在 SignalR 验证具有指定 connectionId 的客户端已收到添加到组命令之前,从 Groups.Add 返回的 Task 不会完成。如果这在 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();
}

}

关于c# - Signalr - 加入多个群组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13906289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com